检查套接字连接

时间:2012-01-19 17:20:42

标签: c# sockets network-programming

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

我目前正在检查插座是否已连接。

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,因此客户端永远不会被视为“断开连接”。有没有其他方法可以测试Connection或者有更可靠的结果。

1 个答案:

答案 0 :(得分:2)

我不确定“第一滴”是什么意思,因为一旦插座下的连接断开,插座必须关闭。这一切都取决于你在CheckSocket()函数之外所做的事情。但假设所有处理都正确,如果底层连接空闲,简单地轮询套接字将无法可靠地工作。

只有在底层传输上有某些流量时才能检测到断开连接。如果连接在闲置时被放弃(未关闭),它将永远静静地坐在那里。要在空闲时检测已放弃的连接,请将setsockopt()SO_KEEPALIVE一起使用。 TCP将定期与另一方交换虚拟流量,以测试连接是否仍处于活动状态,并防止任何NAT或其他动态路由规则超时。请注意,检测丢弃可能需要30秒或更长时间,因为这是TCP的默认超时。