在Windows中挂起/恢复时套接字会发生什么

Oli*_*Oli 10 .net c# sockets c#-4.0

我有一个使用BeginReceiveFrom和EndRecieveFrom监听套接字的ac#.net4应用程序.一切都按预期工作,直到我让机器进入睡眠然后恢复.

此时EndReceieveFrom执行并抛出异常(无法访问已处置的对象).看起来插座是在机器暂停时丢弃的,但我不知道如何处理.

我是否假设所有插座都已经处理好并从头开始重新创建它们?我在跟踪确切问题时遇到问题,因为远程调试也会在暂停/恢复时中断.

hai*_*img 3

挂起/恢复期间发生的情况很大程度上取决于您的硬件和网络设置。如果您的网卡在挂起期间没有禁用,并且挂起时间很短,则打开的连接将在挂起/恢复期间继续存在,不会出现任何问题(当然,打开的 TCP 连接可能会在另一端超时)。

但是,如果您的网络适配器在睡眠期间被禁用,或者 USB 适配器由于连接到禁用的集线器而被禁用,或者您的计算机从 DHCP 获取新的 IP 地址,或者您的无线适配器重新连接到不同的网络适配器,接入点等,那么所有当前连接都将被丢弃,侦听套接字将不再有效,等等。

这并非特定于睡眠/恢复。网络接口可以随时启动和关闭,您的代码必须处理它。您可以使用 USB 网络适配器轻松地模拟这一点,例如将其从计算机中拉出,并且您的代码必须处理它。