我有一个UDP服务器绑定到一个众所周知的端口,将自己添加到多播组,并侦听客户端的请求。 (服务器在Windows上,并使用WSARecvFrom为客户端数据报发出重叠接收。)客户端通过其众所周知的端口和多播IP地址向服务器发送消息。
在笔记本电脑上testing“服务器”时,我注意到,如果笔记本电脑进入“睡眠”状态,服务器的接收套接字将从多播地址变为“未绑定”(这样客户端就不再接收到多播地址) 。 但是,套接字仍在接收中,仍然收到127.0.0.1处的端口发送 – 而Windows没有显示任何错误。 (服务器套接字绑定到INADDR_ANY。)
“服务器”是用于自动发现的点对点应用程序的一部分,所以这种情况并不像预期的那样不寻常。
您能否提出一种方法来确定服务器是否仍在积极监听多播地址而不发送到多播地址(这将导致不必要的stream量通过networking上的所有“服务器”)? 一个可能的解决scheme是发送到用于多播的适配器的IP地址,但我不知道如何确定这一点。
您的网络堆栈将定期发送IGMP消息。 您的网络上的交换机可能使用IGMP监听来确定您的计算机需要哪些(如果有)多播消息。 (这是为了避免由于他们没有请求的流量而在主机上承担过多的负载)。
当您的笔记本电脑睡眠时,它将停止发送确定其对某些多播通信感兴趣的周期性消息。 您的交换机会注意到这一点,并停止发送流量到您的笔记本电脑
我认为您需要确定笔记本电脑从休眠状态恢复并重新向多路广播组添加成员资格。 我已经通过调用WSAIoctl的控制代码SIO_ADDRESS_LIST_CHANGE来完成此操作(加上网络适配器被启用/禁用)。 每当笔记本电脑休眠时,所有适配器都被报告为禁用; 当它恢复时,报告适配器被再次启用。 (请注意,这可能会稍微杂乱一些,因为适配器可能会在几秒之前报告它们实际上能够发送UDP数据报,所以您可能不得不重试几次添加成员资格,每次重试之间有小的延迟。如果您愿意的话,可能会在收到适配器更改的通知后等待30秒。)