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