互联网断开连接时,TcpClient.BeginRead / TcpClient.EndRead不会抛出异常

时间:2011-02-01 18:29:28

标签: c# .net networking

我正在使用TcpListener来接受&从TcpClient读取。 问题是,当从TcpClient进行阅读时,TcpClient.BeginRead / TcpClient.EndRead在互联网断开连接时不会引发异常。仅当客户端的进程结束或服务器或客户端关闭连接时,它才会抛出异常。

4 个答案:

答案 0 :(得分:1)

据我所知,在这种情况下,低级套接字不会通知您。您应该提供自己的超时实施或定期ping服务器。

答案 1 :(得分:1)

如果您想知道网络状态何时发生变化,您可以订阅System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged事件。这不是特定于互联网,只是本地网络。

修改

对不起,我误会了。你对它的思考越多,“连接”的概念就不存在了。 This post很好地了解了有关这方面的更多细节。 Connected上有一个TcpClient属性,但MSDN说(强调我的):

  

因为仅限Connected属性   反映了连接的状态   截至最近的一次行动,你   应该尝试发送或接收   消息来确定当前   州。消息发送失败后,   此属性不再返回true。   请注意,此行为是设计使然。   你无法可靠地测试状态   因为,在时间的连接   在测试和发送/接收之间,   连接可能已丢失。    您的代码应该假设套接字是   连接,优雅地处理   传输失败。

基本上是检查客户端连接的唯一方法,它尝试发送数据。如果它通过,你就连接了。如果它失败了,你就不是。

答案 2 :(得分:1)

系统通常无法知道连接已断开。知道这一点的唯一可靠方法是尝试发送一些东西。执行此操作时,数据包将被发送,然后丢失或退回,并且您的系统知道连接不再可用,并通过错误代码或异常(取决于环境)将问题报告给您。读取通常是不够的,因为读取仅检查输入缓冲区的状态,并且不会将数据包发送到远程端。

答案 3 :(得分:0)

我认为你不希望BeginRead和EndRead抛出异常,因为这些应该在多线程场景中使用。

您可能需要实现一些其他机制来响应丢弃连接。