网络配置更改后,UDP监听套接字停止监听

9
我有一个UDP套接字在一个端口监听广播传输,一切正常。然而,当我将操作系统(Windows 7)休眠并恢复时,套接字就停止接收数据了(使用Wireshark可以看到有数据到达)。如果更改任何网络设置,如更改IP地址、禁用和启用网络适配器等,也会发生这种情况。操作系统似乎在休眠时禁用所有网络适配器,在恢复时重新启用它们。select函数返回0(超时),与没有接收到任何数据时没有区别。我在任何地方都找不到有关此行为的参考。如果我关闭套接字并重新创建它,则它会再次开始工作。在操作系统恢复后,我的TCP监听套接字仍然可以正常工作。有什么想法可以检测和纠正这种情况吗?编辑:它仍然可以直接接收地址数据,只是不能再接收广播传输。编辑2:刚刚发现,如果我向套接字写入数据(发送虚拟数据包到任何地方),它就会再次开始工作...

你可能希望添加与相关的Windows版本相对应的标签。 - jgauffin
套接字绑定的地址是什么? - User
1个回答

2
我认为您的代码没有显式地将套接字绑定到“0.0.0.0”地址。因此,当您进行sentto操作时,它会绑定到那个时刻可用的接口IP。当这个IP被更改或接口被禁用时,这个套接字将被TCP/IP堆栈重置。在您的TCP套接字中,您应该绑定到“0.0.0.0”地址,这样它将始终独立于任何IP/接口更改而监听连接。您也可以在发送任何数据之前将udp套接字绑定到“0.0.0.0”。这将使它即使在休眠或IP更改后仍能正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接