我正在使用TcpListener
来接受&从TcpClient
读取。
问题是,当从TcpClient
进行阅读时,TcpClient.BeginRead
/ TcpClient.EndRead
在互联网断开连接时不会引发异常。仅当客户端的进程结束或服务器或客户端关闭连接时,它才会抛出异常。
答案 0 :(得分:1)
据我所知,在这种情况下,低级套接字不会通知您。您应该提供自己的超时实施或定期ping服务器。
答案 1 :(得分:1)
如果您想知道网络状态何时发生变化,您可以订阅System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
事件。这不是特定于互联网,只是本地网络。
修改强>
对不起,我误会了。你对它的思考越多,“连接”的概念就不存在了。 This post很好地了解了有关这方面的更多细节。 Connected
上有一个TcpClient
属性,但MSDN说(强调我的):
因为仅限Connected属性 反映了连接的状态 截至最近的一次行动,你 应该尝试发送或接收 消息来确定当前 州。消息发送失败后, 此属性不再返回true。 请注意,此行为是设计使然。 你无法可靠地测试状态 因为,在时间的连接 在测试和发送/接收之间, 连接可能已丢失。 您的代码应该假设套接字是 连接,优雅地处理 传输失败。
基本上是检查客户端连接的唯一方法,它尝试发送数据。如果它通过,你就连接了。如果它失败了,你就不是。
答案 2 :(得分:1)
系统通常无法知道连接已断开。知道这一点的唯一可靠方法是尝试发送一些东西。执行此操作时,数据包将被发送,然后丢失或退回,并且您的系统知道连接不再可用,并通过错误代码或异常(取决于环境)将问题报告给您。读取通常是不够的,因为读取仅检查输入缓冲区的状态,并且不会将数据包发送到远程端。
答案 3 :(得分:0)
我认为你不希望BeginRead和EndRead抛出异常,因为这些应该在多线程场景中使用。
您可能需要实现一些其他机制来响应丢弃连接。