9

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

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

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

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

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

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

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

关于如何检测和纠正这种情况的任何想法?

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

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

4

1 回答 1

2

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

于 2014-05-24T11:30:24.803 回答