windows - 检测UDP组播接收失败

标签 windows sockets multicast

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

在笔记本电脑上测试“服务器”时,我注意到如果笔记本电脑进入“ sleep ”状态,服务器的接收套接字将与多播地址“解除绑定(bind)”(这样客户端发送到多播地址就不会-收到时间更长)。但是,套接字仍在接收,因为仍然接收到发送到其 127.0.0.1 端口的消息 - 并且 Windows 没有指示任何错误。 (服务器套接字绑定(bind)到 INADDR_ANY。)

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

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

最佳答案

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

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

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

关于windows - 检测UDP组播接收失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12950159/

相关文章:

找不到配置文件/etc/startup.mk

c - PE 文件部分 - SizeOfRawData 或 VirtualSize

c++ - 凭据提供程序和命名管道

c# - 在 Windows Azure 中部署 Unity3D

java - 当多个线程在同一个 MulticastSocket 上写入时,我是否需要进行某种互斥?

java - 在java上使用套接字打开两个端口连接

node.js - AWS ElasticBeanStalk Node 中的套接字 Io

Java 套接字 : Program stops at socket. getInputStream() 没有错误?

linux - 使用 libpcap 加入/离开多播组

c++ - 从 Linux 上的应用程序更改 TTL