正在检查套接字连接

本文关键字:连接 套接字 检查 | 更新日期: 2023-09-27 18:20:44

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

我目前这样做是为了检查是否连接了插座。

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

正在检查套接字连接

我不知道你所说的"第一次断开"是什么意思,因为一旦断开了套接字下的连接,套接字就必须关闭。这一切都取决于你在CheckSocket()函数之外做什么。但是,假设所有这些都得到了正确处理,如果底层连接空闲,那么简单地轮询套接字将无法可靠地工作。

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