2011-02-27 1 views
1

두 개의 NIC가있는 컴퓨터에 멀티 캐스트 클라이언트를 작성하려고하는데 작동하지 않습니다. NIC (eth4)가 멀티 캐스트 데이터 그램을 받기 시작한 프로그램을 시작하면 스니퍼가 볼 수 있지만 프로그램에서 수신 할 수는 없습니다.여러 개의 NIC가있는 C++에서 멀티 캐스트를 청취 할 때 문제가 발생했습니다.

실행 "tshark를 -i eth4 -R udp.port == XXX (멀티 캐스트 포트)"
내가 얻을 :
1059.435483 y.y.y.y. (일부 IP) -> zzzz (멀티 캐스트 IP, 내 eth4 NIC IP가 아님) UDP 소스 포트 : kkk (일부 다른 포트) 대상 포트 : xxx (멀티 캐스트 포트)

일부 예제/설명을 웹에서 검색했지만 다른 사람들이하는 일을하는 것처럼 보입니다. 어떤 도움을 주시면 감사하겠습니다. 특정 IP 주소에 바인딩하고 있기 때문에 (I 멀티 캐스트와 많은 작업을하지했습니다),

bool connectionManager::sendMulticastJoinRequest() 
{ 
struct sockaddr_in localSock; 
struct ip_mreqn group; 

char* mc_addr_str = SystemManager::Instance()->getTCP_IP_CHT(); 
char* local_addr_str = SystemManager::Instance()->getlocal_IP_TOLA(); 
int port = SystemManager::Instance()->getTCP_Port_CHT(); 
/* Create a datagram socket on which to receive. */ 

CHT_UDP_Feed_sock = socket(AF_INET, SOCK_DGRAM, 0); 

if(CHT_UDP_Feed_sock < 0) 
{ 
    perror("Opening datagram socket error"); 
    return false; 
} 
/* application to receive copies of the multicast datagrams. */ 
{ 
    int reuse = 1; 
    if(setsockopt(CHT_UDP_Feed_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0) 
    { 
     perror("Setting SO_REUSEADDR error"); 
     close(CHT_UDP_Feed_sock); 
     return false; 
    } 
} 

/* Bind to the proper port number with the IP address */ 
/* specified as INADDR_ANY. */ 
memset((char *) &localSock, 0, sizeof(localSock)); 
localSock.sin_family = AF_INET; 
localSock.sin_port = htons(port); 
localSock.sin_addr.s_addr =inet_addr(local_addr_str); // htonl(INADDR_ANY); // 
if(bind(CHT_UDP_Feed_sock, (struct sockaddr*)&localSock, sizeof(localSock))) 
{ 
    perror("Binding datagram socket error"); 
    close(CHT_UDP_Feed_sock); 
    return false; 
} 

/* Join the multicast group mc_addr_str on the local local_addr_str */ 
/* interface. Note that this IP_ADD_MEMBERSHIP option must be */ 
/* called for each local interface over which the multicast */ 
/* datagrams are to be received. */ 

group.imr_ifindex = if_nametoindex("eth4"); 
if (setsockopt(CHT_UDP_Feed_sock, SOL_SOCKET, SO_BINDTODEVICE, "eth4", 5) < 0) 
    return false; 
group.imr_multiaddr.s_addr = inet_addr(mc_addr_str); 
group.imr_address.s_addr = htonl(INADDR_ANY); //also tried inet_addr(local_addr_str); instead 
if(setsockopt(CHT_UDP_Feed_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0) 
{ 
    perror("Adding multicast group error"); 
    close(CHT_UDP_Feed_sock); 
    return false; 
} 

// Read from the socket. 
char databuf[1024]; 
int datalen = sizeof(databuf); 
if(read(CHT_UDP_Feed_sock, databuf, datalen) < 0) 
{ 
    perror("Reading datagram message error"); 
    close(CHT_UDP_Feed_sock); 
    return false; 
} 
else 
{ 
    printf("Reading datagram message...OK.\n"); 
    printf("The message from multicast server is: \"%s\"\n", databuf); 
} 
return true; 
} 
+0

물론 이것이 모든 단일 방법이 아닙니까? 분명히 멀티 캐스트 그룹에 먼저 가입하고 여러 번 전화하는 별도의 방법을 통해 수신합니까? – EJP

+0

저자의 중복 된 질문 : http://stackoverflow.com/questions/5111209/problem-in-listening-to-multicast-in-c-with-multiple-nics –

답변

1

그냥 생각을 (아무것도? 경로/iptables에/코드와 함께해야 할 일), 그러나 그것은 될 수 있을까? 소켓은 바인딩 된 IP 주소로 지정된 패킷 만 받아들이고 멀티 캐스트 패킷은 거부 할 수 있습니까?

+0

하지만 그는 특정 IP 주소에 바인딩하지 않습니다. 그는 INADDR_ANY에 바인딩하고 있습니다. – EJP

+0

위의 코드를 마지막으로 살펴보면 INADDR_ANY가있는 local_addr_str이 있습니다. 그 이후로는 분명히 편집되었습니다. – Majenko

0

글쎄, 내가 멀티 캐스트로 놀지 않아서 얼마 전부터있다. 그것을 사용하기 위해 루트/관리자 권한이 필요하지 않습니까? 프로그램을 시작할 때 사용하도록 설정 했습니까?

관련 문제