2011-02-24 23 views
0


我想在有两个NIC的机器上编写多点传送客户端,但我无法使其工作。
我可以看到一个嗅探器,一旦我启动程序的NIC(eth4)开始接收多播数据报,但是,我无法接收()我的程序中的任何。
运行时 “tshark的-i ETH4 -R udp.port == XXX(多播端口)”
我得到:
1059.435483 y.y.y.y. (某些IP) - > zzzz(多播IP,不是我的eth4 NIC IP)UDP源端口:kkk(某些其他端口)目标端口:xxx(多播端口)收听C++多点传送多点传送的问题

搜索网络的一些示例/解释,看起来像我做别人做的事情。
任何帮助将不胜感激...
谢谢!

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 2011-02-25 08:42:03

+0

不重复。它没有帮助。我可以看到多播正在获得eth4,但出于某种原因,我无法在我的套接字上看到它.. – 2011-02-26 14:57:38

回答

0

调用IP_ADD_MEMBERSHIP设置之前了这样的:

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

您可以将呼叫SO_BINDTODEVICE在此之前,但这只是必要的,如果你只愿意喜欢使用一个特定的接口。

+0

没有帮助..任何其他想法? – 2011-02-25 17:47:07

+0

它究竟在哪里失败? – ldx 2011-02-25 19:48:17

+0

receive()正在等待套接字上的传入数据..虽然我看到它来了(使用tcpdump) – 2011-02-26 15:55:02

0

我完全像这样设置了组(代码已更新)。
我还添加了路由表“route add -net 224.0.0.0 netmask 240.0.0.0 dev eth4”
仍然没有成功。
除此之外,我需要在我的环境中设置其他任何东西吗?