통신관련 질문(multicasting)

gozealot의 이미지

아래 코드를 실행하면 멀티캐스트 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;
}

gozealot의 이미지

이어서 올립니다.

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;
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.