10

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

此时 EndReceieveFrom 执行并引发异常(无法访问已处置的对象)。看来,当机器暂停时,套接字已被处理,但我不知道如何处理这个问题。

我是否假定所有套接字都已被处理并从头开始重新创建它们?我在追踪确切问题时遇到问题,因为远程调试也会在暂停/恢复时中断。

4

2 回答 2

4

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

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

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

于 2012-11-29T18:51:54.480 回答
0

我在挂起/恢复和套接字方面遇到了类似的问题(在 .NET 4 和 Windows 8 下,但我怀疑不限于这些)。

具体来说,我有一个只接收数据的客户端套接字应用程序。阅读是通过 BeginReceive 和回调完成的。回调中的代码处理了典型的故障情况(例如,远程服务器是否正常关闭连接)。

当客户端机器进入睡眠状态时(这可能也适用于较新的 Windows 8 快速启动模式,这实际上只是一种睡眠/休眠),服务器将在几秒钟后关闭连接。但是,当客户端醒来时,没有调用异步读取回调(我希望会发生这种情况,因为它应该在套接字有错误条件/除了有数据之外关闭时被调用)。我在客户端上明确添加了计时器代码,以定期检查这种情况并恢复,但是即使在这里(并使用 Poll、Available 和 Connected 的组合来检查连接是否已启动)客户端上的套接字仍然出现已连接,因此恢复代码永远不会运行。我想如果我尝试发送数据,那么我会收到一个错误,但正如我所说,这严格来说是单向的。

我最终使用的解决方案是检测从睡眠状态恢复并在发生这种情况时关闭并重新建立我的套接字连接。检测简历的方法有很多种;在我的情况下,我正在编写一个 Windows 服务,所以我可以简单地覆盖 ServiceBase.OnPowerEvent 方法。

于 2014-04-01T23:32:45.727 回答