检测UDP组播接收失败

时间:2012-10-18 08:23:01

标签: windows sockets multicast

我有一个UDP服务器,它绑定到一个众所周知的端口,将自己添加到一个多播组并监听客户端的请求。 (服务器在Windows上,并使用WSARecvFrom为客户端数据报发出重叠接收。)客户端以其众所周知的端口和多播IP地址向服务器发送消息。

在笔记本电脑上测试“服务器”时,我注意到如果笔记本电脑进入“睡眠”状态,服务器的接收套接字将从多播地址变为“未绑定”(因此客户端发送到多播地址的行为是 - 收到的时间更长)但是,套接字仍在接收,仍然接收到127.0.0.1的端口发送 - 并且Windows不指示任何错误。 (服务器套接字绑定到INADDR_ANY。)

“服务器”是用于自动发现的点对点应用程序的一部分 - 因此这种情况并不像预期的那样不寻常。

您能否建议一种方法来确定服务器是否仍在主动侦听多播地址而不发送到多播地址(这会导致网络上所有“服务器”的不必要流量)?一种可能的解决方案是发送到用于多播的适配器的IP地址,但我不知道如何确定它。

1 个答案:

答案 0 :(得分:7)

您的网络堆栈会定期发送IGMP条消息。网络上的交换机可能会使用IGMP snooping来确定您的计算机需要哪些(如果有)多播消息。 (这是为了避免由于他们没有请求的流量而在主机上施加过多的负载。)

当您的笔记本电脑休眠时,它将停止发送定期消息,确认其对某些多播流量感兴趣。您的交换机会注意到这一点并停止将流量发送到您的笔记本电脑。

我认为您需要确定笔记本电脑何时从休眠状态恢复,并重新添加成员资格。我过去通过使用控制代码WSAIoctl调用SIO_ADDRESS_LIST_CHANGE来完成此操作(以及启用/禁用网络适配器)。每当笔记本电脑休眠时,所有适配器都被报告为禁用;恢复时,报告适配器再次启用。 (请注意,这可能会略显繁琐,因为在实际能够发送UDP数据报之前几秒钟可以将适配器报告为可用,因此您可能必须重试添加成员资格几次,每次重试之间的延迟很小。或者您如果您愿意,可以在收到适配器更改通知后等待30秒。)