簡體   English   中英

在具有多個NIC的C ++中偵聽多播的問題

[英]Problem in listening to multicast in C++ with multiple NICs

你好
我想寫一台機器上的多播客戶端兩個網卡,我不能使它發揮作用。
我用嗅探器看到,一旦啟動程序,NIC(eth4)就開始接收多播數據報,但是,程序中我什么也收不到。
運行“ tshark -i eth4 -R udp.port == xxx(多播端口)”時
我得到:
1059.435483 YYYY(有些IP) - > ZZZZ(IP組播,不是我的ETH4網卡的IP),UDP源端口:KKK(一些其他的端口)目標端口:XXX(多播端口)

搜索一些例子/解釋網頁,但好像我做什么其他人一樣。
任何幫助將不勝感激...
謝謝!

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;
}   

在調用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的調用,但這僅在您只想使用一個特定接口的情況下才需要。

我完全按照這樣設置組(更新了代碼)。
我還將添加到路由表“ route add -net 224.0.0.0 netmask 240.0.0.0 dev eth4”
仍然沒有成功。
除此之外,我還需要在環境中設置其他任何內容嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM