我有一个定期从其他应用程序接收多播更新的应用程序。只要接收方应用程序与发送方位于同一主机上,我就能够获取组播数据包。如果接收方应用程序是同一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;
}
}