繁体   English   中英

我的IsConnected始终返回true

[英]My IsConnected always returns true

测试用例:

  1. 在连接开始之前,它应该返回false
  2. 连接被其他结束返回false关闭
  3. 连接由客户端返回false关闭
  4. 即使没有数据可用,也存在连接返回true

     class MyConnection { //Assume I have all initialization for _socket public bool IsConnected() { return !(_socket.Poll(1, SelectMode.SelectRead) && _socket.Available == 0); } private Socket _socket; 

    }

     class Test { static void Main(string[] args) { MyConnection my = new MyConnection() if(my.IsConnected()) /*always return true even when I am not connected*/; } } 

任何想法如何预防?


到目前为止,没有一个答案令人满意......

可以完成以下操作:

   public bool IsConnected()
        {

            bool bConnected = false;
            bool bState = _socket.Poll(1, SelectMode.SelectRead);
            try
            {
                if (bState && (_socket.Available == 0))
                    bConnected = false;
                else
                    bConnected = true;
            }
            catch (SocketException)
            {
                //_socket.Available can throw an exception
                bConnected = false;
            }

            return bConnected;
        }

我认为你的_socket.Poll()调用是倒退的。 如果轮询失败,那将有助于该方法评估为true而不是false。 尝试这个:

public bool IsConnected()
{
    return !(!_socket.Poll(1, SelectMode.SelectRead)
                                && _socket.Available == 0);

}

我也不确定将_socket.Available作为此检查的一部分是个好主意。 根据文档 ,返回值0只表示“没有数据在网络缓冲区中排队”。 即使是连接的插座,这也很容易实现。

我不确定你想要实现的目标,但假设你试图判断连接是否已被破坏,这篇文章可能会有所帮助:

如何判断基于套接字的客户端连接是否已断开?

编辑:故障排除步骤是确定两个布尔表达式中的哪一个返回false,或者它们是否都返回false。

在我看来,你可能无法获得你期望从Socket类中获得的功能。 我的理解是Socket类只知道最后一个套接字操作的连接状态。

请注意, Poll方法有一些限制:

此方法无法检测某些类型的连接问题,例如网络电缆损坏,或者远程主机无法正常关闭。 您必须尝试发送或接收数据以检测这些类型的错误。

这意味着如果出现非正常的断开连接,套接字继续报告为真,直到后续套接字操作超时(这可以解释您在之前的帖子中经历的几分钟延迟)是正常的。

这意味着如果要检测不合适的断开连接,您可能需要实现应用程序级心跳/ ping,如上一个答案中所述 您可能需要使用ping之间的间隔,否则您将失去一定程度的容错能力,并且延迟峰值可能会导致不需要的断开连接报告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM