멀티캐스트에 대한 질문입니다.

yhjj777의 이미지

간단한 멀티캐스트 샘플을 제작중인데요.
같은 라우터 안에서 테스트를 하면 데이터를 잘받아오는데
외부에서는 데이터를 받아오지를 못합니다. 주소는 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]
iyouhe의 이미지

다른 서브넷으로 이동시 해당 라우팅 머신에서 멀티캐스트 라우팅을 지원해야 합니다.

그게 지원되지 않으면 TTL이 255라더라도 패킷이 다른 서브넷으로 전달되지 않는걸로 알고 있습니다.

리눅스에서도 커널 설정에서 멀티캐스트 라우팅은 빠져 있는 걸로 알고 있습니다.

배울수 있어서 좋다.

lhuijae의 이미지

프로그램 돌려보고서 궁금해서요.. 다른 누군가도 같은 멀티캐스트 주소로 서비스를 한다고하면 어떻게 돼죠? 해보니까 bind에서 바로 종료가 되는군요..
그럼 먼저 멀티캐스트 주소를 먼저 선점하는 넘이 임자인가요? 죄송합니다.. 개념이 없어서..

yhjj777의 이미지

lhuijae wrote:
프로그램 돌려보고서 궁금해서요.. 다른 누군가도 같은 멀티캐스트 주소로 서비스를 한다고하면 어떻게 돼죠? 해보니까 bind에서 바로 종료가 되는군요..
그럼 먼저 멀티캐스트 주소를 먼저 선점하는 넘이 임자인가요? 죄송합니다.. 개념이 없어서..

bind 하는건 클라이언트입니다.. 서버는 멀티캐스트 주소로 데이터를
보내주기만 하면 되고 클라이언트쪽에서는 멀티캐스트 주소에 관심있다는
것을 알려주고 데이타를 받아오기만 하면 됩니다.. 자세한 내용은
http://kldp.org/HOWTO/html/Multicast/Multicast-HOWTO.html
이곳을 참고하시길.. -_-;

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.