2011-02-01 52 views

回答

1

系统通常没有机会知道连接中断。知道这个的唯一可靠的方法是尝试发送一些东西。当你这样做时,数据包被发送,然后丢失或反弹,你的系统知道连接不再可用,并通过错误代码或异常(取决于环境)将问题报告给你。读取通常是不够的,因为读取只会检查输入缓冲区的状态,并不会将数据包发送到远程端。

1

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

+0

我不能ping,因为我是服务器:( – 2011-02-01 18:48:43

0

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

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

1

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

编辑

对不起,我误会了。 “连接”的概念实际上并不存在你对它的更多想法。 This post在进入更多细节方面做得很好。有一个Connected财产上的TcpClient但MSDN说(重点煤矿):

,因为连接的属性只 体现为最近操作的连接 的状态,你 应该尝试发送或接收一个 消息来确定当前的 状态。消息发送失败后, 此属性不再返回true。 请注意,此行为是设计。 您无法可靠地测试 连接的状态,因为在测试和发送/接收之间的时间为 ,连接可能已经丢失。 你的代码应该假设连接的套接字是 ,并优雅地处理 失败的传输。

基本上只有这样,才能检查客户端连接它来尝试发送数据。如果它通过,你连接。如果失败了,你不是。

+0

但我是服务器,并且当客户端从互联网断开,我无法检查它的网络状态。 – 2011-02-01 18:44:43