2012-01-19 153 views
1

尝试了一些检测远程套接字是否已断开连接的不同方法。检查套接字连接

我目前这样做是为了检查套接字是否连接。

public void CheckSocket() 
{ 
    try 
    { 
     bool test1 = s.Poll(_MicrosecondFaultTolerance, SelectMode.SelectRead); 
     bool test2 = (s.Available == 0); 
     if (test1 && test2) 
      _Active = false; 
    } 
    catch 
    { 
     _Active = false; 
    } 
} 

这对于某些原因,所有的不问时间完美的作品的首次下降,但在此之后,检查不设置_active为false,因此客户端从不认为“断开连接”。有没有其他的方式可以测试一个连接或者有一个更可靠的结果。

+0

可能重复的[如何检查一个套接字是否连接/断开在C#?](http://stackoverflow.com/questions/2661764/how-to-check-if-a-socket-is-connected-断开式-c)的 –

回答

2

我不确定“第一滴”是什么意思,因为一旦套接字下的连接被丢弃,套接字必须关闭。这一切都取决于你在CheckSocket()函数之外做什么。但假设所有处理都正确,只要基础连接空闲,简单地轮询套接字将无法可靠地工作。

只有在底层传输中存在一些流量时才能检测到断开连接。如果一个连接在闲置时被放弃(不关闭),它将永远静静地坐在那里。要在闲置时检测废弃连接,请使用setsockopt()SO_KEEPALIVE。 TCP将定期与另一端交换虚拟通信量,以测试连接是否仍然存在,并防止任何NAT或其他动态路由规则超时。请注意,检测到丢失仍需要30秒或更多时间,因为这是TCP的默认超时。