2011-02-24 2 views
0

안녕
두 개의 NIC가있는 컴퓨터에 멀티 캐스트 클라이언트를 쓰려고하는데 작동하지 않습니다.
일단 프로그램을 시작하면 NIC (eth4)가 멀티 캐스트 데이터 그램을 받기 시작한다는 것을 스 니퍼 (sniffer)가 알 수 있습니다. 그러나 프로그램에서 수신 할 수는 없습니다.
실행 "tshark를 -i eth4 -R udp.port == XXX (멀티 캐스트 포트)"
내가 얻을 :
1059.435483 y.y.y.y. (일부 IP) -> zzzz (멀티 캐스트 IP, 내 eth4 NIC IP가 아님) UDP 소스 포트 : kkk (일부 다른 포트) 대상 포트 : xxx (멀티 캐스트 포트)여러 개의 NIC가있는 C++에서 멀티 캐스트를 청취 할 때 문제가 발생했습니다.

일부 예제/설명을 웹에서 검색했지만 다른 사람들이하는 일을하는 것처럼 보입니다.
도움이 될 것입니다 ...
감사! IP_ADD_MEMBERSHIP에 대한 호출은 다음과 같이 그룹을 설정하기 전에

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

중복 되었습니까? http://stackoverflow.com/questions/4054238/udp-multicast-from-specific-network-card – young

+0

중복되지 않습니다. 도움이되지 않았다. 멀티 캐스트가 eth4를 받고있는 것을 볼 수 있습니다. 그러나 어떤 이유로 든 내 소켓에서 볼 수 없습니다 .. –

답변

0

: 당신은 그 이전에 SO_BINDTODEVICE에 전화를 남길 수 있습니다,하지만 당신은 단지한다면 그에만 필요의

group.imr_multiaddr.s_addr = inet_addr(mc_addr_str); 
group.imr_address.s_addr = inet_addr(local_addr_str); 

하나의 특정 인터페이스를 사용하는 것을 좋아합니다.

+0

다른 아이디어가 있습니까? –

+0

정확히 어디에서 실패합니까? – ldx

+0

receive()가 소켓에서 들어오는 데이터를 기다리고 있습니다 .. (tcpdump를 사용하여) 오는 것을 볼 수 있지만 –

0

정확하게 (코드가 업데이트 됨) 그룹을 설정합니다.
또한 라우팅 테이블에 "route add -net 224.0.0.0 netmask 240.0.0.0 dev eth4"
을 추가하면 성공하지 못합니다.
그 외에도 다른 환경에서 설정해야 할 사항이 있습니까?

관련 문제