멀티캐스트에 대한 질문입니다.
글쓴이: yhjj777 / 작성시간: 수, 2003/03/12 - 11:09오전
간단한 멀티캐스트 샘플을 제작중인데요.
같은 라우터 안에서 테스트를 하면 데이터를 잘받아오는데
외부에서는 데이터를 받아오지를 못합니다. 주소는 225.100.100.1을
사용하였고 TTL 값은 255 를 사용했거든요. 소스를 첨부하니 무슨
문제가 있는 알려주시면 감사드리겠습니다.
데이타를 보내는 쪽
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <netinet/in.h> int main() { int sock, dummy, count = 0; struct sockaddr_in multicastAddr; char sendString[255]; unsigned char multicastTTL; unsigned int sendStringLen; multicastTTL = 255; sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); if( sock < 0 ) return -1; dummy = setsockopt( sock, IPPROTO_IP, IP_MULTICAST_TTL, (void *) &multicastTTL, sizeof( multicastTTL ) ); if( dummy < 0 ) return -1; memset( &multicastAddr, 0, sizeof( multicastTTL ) ); multicastAddr.sin_family = AF_INET; multicastAddr.sin_addr.s_addr = inet_addr( "225.100.100.1" ); multicastAddr.sin_port = htons( 6000 ); dummy = connect( sock, (struct sockaddr *) &multicastAddr, sizeof( multicastAddr ) ); if( dummy < 0 ) return -1; for( ;; ) { memcpy( sendString, &count, sizeof( int ) ); sendStringLen = strlen( sendString ); dummy = write( sock, sendString, sendStringLen ); if( dummy == sendStringLen ) count++; usleep(100); } return 0; }
데이타를 받는 쪽
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <netinet/in.h> #define MAXRECVSTRING 255 int main() { int sock = 0, dummy = 0, count = 0, before = 0, all = 0, complete = 0, error = 0; float per = 0; struct sockaddr_in multicastAddr; char recvString[MAXRECVSTRING+1]; int recvStringLen = 0; struct ip_mreq multicastRequest; sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); if( sock < 0 ) return -1; memset( &multicastAddr, 0, sizeof( multicastAddr ) ); multicastAddr.sin_family = AF_INET; multicastAddr.sin_addr.s_addr = htonl( INADDR_ANY ); multicastAddr.sin_port = htons( 6000 ); dummy = bind( sock, (struct sockaddr *) &multicastAddr, sizeof( multicastAddr ) ); if( dummy < 0 ) return -1; multicastRequest.imr_multiaddr.s_addr = inet_addr( "225.100.100.1" ); multicastRequest.imr_interface.s_addr = htonl( INADDR_ANY ); dummy = setsockopt( sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *) &multicastRequest, sizeof( multicastRequest ) ); if( dummy < 0 ) return -1; while(1) { recvStringLen = recvfrom( sock, recvString, MAXRECVSTRING, 0, NULL, 0 ); if( recvStringLen < 0 ) return -1; all++; memcpy( &count, recvString, sizeof( int ) ); if( ( before + 1 ) != count ) { error++; per = (float )complete / all; printf( "%d \t %d \t %d \t %.5f\n", all, complete, error, per ); } else { complete++; } before = count; } return 0; }[/code]
Forums:
라우터에서 멀티캐스팅을 지원해야 합니다.
다른 서브넷으로 이동시 해당 라우팅 머신에서 멀티캐스트 라우팅을 지원해야 합니다.
그게 지원되지 않으면 TTL이 255라더라도 패킷이 다른 서브넷으로 전달되지 않는걸로 알고 있습니다.
리눅스에서도 커널 설정에서 멀티캐스트 라우팅은 빠져 있는 걸로 알고 있습니다.
배울수 있어서 좋다.
궁금해서 물어보는건데요..
프로그램 돌려보고서 궁금해서요.. 다른 누군가도 같은 멀티캐스트 주소로 서비스를 한다고하면 어떻게 돼죠? 해보니까 bind에서 바로 종료가 되는군요..
그럼 먼저 멀티캐스트 주소를 먼저 선점하는 넘이 임자인가요? 죄송합니다.. 개념이 없어서..
Re: 궁금해서 물어보는건데요..
bind 하는건 클라이언트입니다.. 서버는 멀티캐스트 주소로 데이터를
보내주기만 하면 되고 클라이언트쪽에서는 멀티캐스트 주소에 관심있다는
것을 알려주고 데이타를 받아오기만 하면 됩니다.. 자세한 내용은
http://kldp.org/HOWTO/html/Multicast/Multicast-HOWTO.html
이곳을 참고하시길.. -_-;
댓글 달기