windows – 检测UDP多播接收失败

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

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

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

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

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

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

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

转载注明原文:windows – 检测UDP多播接收失败 - 代码日志