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

发布于 2024-12-09 19:22:31 字数 530 浏览 3 评论 0原文

我有一个 UDP 套接字在端口中侦听广播传输,并且工作正常。

但是,当我休眠并恢复操作系统(Windows 7)时,套接字只是停止接收数据(并且我可以使用 Wireshark 看到有数据到达)。

如果我更改任何网络设置(例如更改 IP 地址、禁用和启用网络适配器),也会发生这种情况。

操作系统似乎在休眠时禁用所有网络适配器,并在恢复时重新启用它们。

select 仅返回 0 (超时),这与我没有收到任何数据时没有什么不同。我在任何地方都找不到任何对此行为的引用。

如果我关闭套接字并重新创建它,它就会再次开始工作。

恢复操作系统后,我的 TCP 监听套接字仍然工作正常。

关于如何检测和纠正这种情况有什么想法吗?

编辑:它仍然可以很好地直接接收地址数据,只是不再接收广播传输。

编辑2:刚刚发现,如果我写入套接字(向任何地方发送虚拟数据包),它就会再次开始工作......

I have a UDP socket listening in a port for broadcast transmissions and it is working fine.

However, when I hibernate and resume the OS (Windows 7), the socket just stops receving data (and I can see that there is data arriving using Wireshark).

This also happens if I change any network settings like, change my IP address, disable and enable the network adapter.

The OS seems to disable all network adapters when hibernating and to re-enable them when it is resumed.

select just returns 0 (timeout) which is no different than when I'm not receiving any data. I could not find any references to this behavior anywhere.

If I close the socket and recreate it, it starts to work again.

My TCP listening sockets still working fine after resuming the OS.

Any ideas on how detect and correct this situation?

EDIT: It still receiving directly addresses data just fine, it just does not receive brodcast transmissions anymore.

EDIT2: Just discovered that if I write to the socket (send a dummy packet to anywhere) it starts to work again...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

山有枢 2024-12-16 19:22:31

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

I think your code does not explicitly binds the socket to "0.0.0.0" address. So when you do sentto it binds the interface IP which is available at that time. When this IP is changed or interface is disabled, this socket will be reset by the TCP/IP stack. In your TCP socket, you should have bound to "0.0.0.0" address so it will always listen for connection independent of any IP/interface changes. You can make your udp socket also bound to "0.0.0.0" before sending any data on it. This will make it work even after hibernation or IP changes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文