无法在发送主机之外接收多播数据包

时间:2015-01-30 18:56:56

标签: c++ c sockets multicast

我有一个定期从其他应用程序接收多播更新的应用程序。只要接收方应用程序与发送方位于同一主机上,我就能够获取组播数据包。如果接收方应用程序是同一LAN中的另一台主机,则无法读取多播数据包。我可以在两台机器上的wireshark上看到那些数据包。

Host A [Win8.1]- Both Wireshark and my app can read the packets.
Host B [Win2012 R2] - Only Wireshark can see the packets, my app reads nothing.

发件人在主机A上。如果重要,主机A也启用了Hyper-V。

我的应用程序使用Boost.asio套接字,我也看到了使用C套接字的相同结果。下面是C示例,为简单起见,所有错误处理都被剥离了。它仅适用于主机A,但不适用于主机B.

编辑:我今天尝试了一些疯狂的事情。

我使用相同的MC地址和端口在主机B上启动了相同的发件人。现在接收器开始接收来自主机A和B的传输。然后我关闭主机B上的发送器,但接收器继续接收来自主机A的数据包。现在我重新启动主机B上的接收器,它再次作为蝙蝠盲目。

void Receiver(const char* mc_address, short port)
{
    struct sockaddr_in addr;
    int addrlen, sock;
    struct ip_mreq mreq;
    char message[500];

    sock = socket(AF_INET, SOCK_DGRAM, 0);
    memset(&addr,0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(port);
    addrlen = sizeof(addr);
    bind(sock, (struct sockaddr *) &addr, sizeof(addr));
    mreq.imr_multiaddr.s_addr = inet_addr(mc_address);         
    mreq.imr_interface.s_addr = INADDR_ANY;         
    setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,(const char*)&mreq, sizeof(mreq)); 

    while (1) 
    {
        int count = recvfrom(sock, message, sizeof(message), 0, (struct sockaddr *) &addr, &addrlen);
        if (count == 0) break;
        message[count] = 0;
        std::cout << message << std::endl;
    }
}

0 个答案:

没有答案