통신관련 질문(multicasting)
아래 코드를 실행하면 멀티캐스트 recvfrom이 정상적으로 리턴되지 않습니다. (Block 상태)
일반 udp 프로토콜로 sendto, recvfrom하면 같은 pc 에서는 잘 되는데 다른 pc 에서는 또 되지 않는군요.
비슷한 코드를 윈도우즈로 만들어 테스트한 결과 정상적으로 udp, udp multicasting 이 성공했습니다.
그럼 네트웤 문제는 아닌 소스 코드상 문제 인듯 한데 알 수 가 없군요..
위의 코드중 Thread, select 를 모두 제거 하고 간단히 recvfrom 에서 블럭되고 있다가 sendto 해보았
습니다만 그것도 정상적으로 return 되지 못합니다. (계속 Block상태...)
많은 답변 부탁드립니다.
// 해더파일은 생략 합니다.
#define BUFFER_SIZE 1024
void* execute(void *arg);
int main(int argc, char **argv)
{
int state, sock;
struct sockaddr_in addr;
struct ip_mreq groupaddr;
char type[4] = { '\0', };
memcpy(type, argv[1], 4);
sock = socket(PF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
printf("socket() error.\n");
return -1;
}
/* 멀티캐스트 그룹 주소 지정 */
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[3]));
addr.sin_addr.s_addr = htonl(INADDR_ANY);
state = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
if (state) {
printf("bind() error : errno = [%d].\n", errno);
close(sock);
return -1;
}
groupaddr.imr_multiaddr.s_addr = inet_addr(argv[2]);
groupaddr.imr_interface.s_addr = htons(INADDR_ANY);
if (!strcmp(type, "mul")) {
state = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *)&groupaddr, sizeof(groupaddr));
if (state) {
printf("setsockopt() error.\n");
return -1;
}
}
pthread_t id;
void *retval;
pthread_create(&id, NULL, execute, (void *)sock);
pthread_join(id, &retval);
close(sock);
return 0;
}
void* execute(void *arg)
{
printf("Receiver is ready.\n");
int iStatus, socket = (int)arg;
unsigned char buffer[BUFFER_SIZE] = { '\0', };
fd_set reads, temps;
struct timeval timeout;
FD_ZERO(&reads);
FD_SET(socket, &reads);
timeout.tv_sec = 1;
timeout.tv_usec = 0;
while (1) {
int fd, length;
temps = reads;
iStatus = select(socket + 1, &temps, 0, 0, &timeout);
if (iStatus == -1) {
printf("select() error.\n");
break;
}
else if (iStatus == 0) {
//printf("timeout.\n");
}
else {
for (fd = 0; fd < socket + 1; fd++) {
if (FD_ISSET(fd, &temps)) {
if (fd == socket) {
memset(buffer, '\0', BUFFER_SIZE);
int RealRcvdCount = recvfrom(fd, buffer, BUFFER_SIZE, 0, NULL, 0);//read(fd, Data,length);
printf("[%d bytes] recevied : %s\n", RealRcvdCount, buffer);
if (length == 0) {
close(fd);
//exit(1);
}
}
} // if (FD_ISSET(fd, &temps))
} // for (fd = 0; fd < m_Socket + 1; fd++)
} // else
} // while (1)
return NULL;
}
위의 글리 짤리는군요..
이어서 올립니다.
while (1) {
int fd, length;
temps = reads;
iStatus = select(socket + 1, &temps, 0, 0, &timeout);
if (iStatus == -1) {
printf("select() error.\n");
break;
}
else if (iStatus == 0) {
//printf("timeout.\n");
}
else {
for (fd = 0; fd 가 socket+1보다 작으면; fd++) {
if (FD_ISSET(fd, &temps)) {
if (fd == socket) {
memset(buffer, '\0', BUFFER_SIZE);
int RealRcvdCount = recvfrom(fd, buffer, BUFFER_SIZE, 0, NULL, 0);//read(fd, Data,length);
printf("[%d bytes] recevied : %s\n", RealRcvdCount, buffer);
if (length == 0) {
close(fd);
//exit(1);
}
}
} // if (FD_ISSET(fd, &temps))
} // for (fd = 0; fd < m_Socket + 1; fd++)
} // else
} // while (1)
return NULL;
}
댓글 달기