【问题标题】:My IsConnected always returns true我的 IsConnected 总是返回 true
【发布时间】:2009-04-15 20:29:57
【问题描述】:

测试用例:

  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;
        }

【问题讨论】:

  • 拔掉网线? :-)
  • 如果您发布您真正想要实现的目标,您可能会发现它更有成效。

标签: c# .net sockets


【解决方案1】:

我认为您的_socket.Poll() 电话是倒退的。如果轮询失败,这将有助于方法评估为真而不是假。试试这个:

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

}

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

【讨论】:

  • 你确定这会在这两种情况下确定套接字是否连接:1)连接开始之前 2)连接断开之后
  • 不会:请参阅我关于 _socket.Available 的注释。但这是对您当前代码的改进。对于条件#1,我只会在您的班级中保留一个私人成员进行检查。对于 #2,.Poll 要么是足够的,要么不是。
  • 乔尔,我不需要改进,我更喜欢完全有效的解决方案。不过感谢您的努力....
  • meh- 我回答了你问的问题:为什么它总是返回“true”。
  • 几乎:你说 _socket.Poll(1, SelectMode.SelectRead) 都是倒退的。不是——如果连接断开以及数据可用时返回 true...
【解决方案2】:

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

How can I tell if the connection has been broken in my sockets based client?

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

【讨论】:

  • 那是我的帖子!不完整的解决方案:)
  • 哈哈!很公平,我想它相似是有原因的——我应该检查一下作者。
【解决方案3】:

在我看来,您可能无法从 Socket 类中获得您期望的功能。我的理解是 Socket 类只知道上次套接字操作时的连接状态。

请注意,Poll method 有一些限制:

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

这意味着在不正常断开连接的情况下,套接字继续报告 true 直到随后的套接字操作超时是正常的(这可能解释了您在上一篇关于此的帖子中遇到的几分钟延迟)。

这意味着如果您想检测不正常的断开连接,您可能需要按照previous answer 中的建议实施应用程序级别的心跳/ping。您可能需要调整 ping 之间的间隔,否则您会失去一定程度的容错能力,并且延迟峰值可能会导致不必要的断开连接报告。

【讨论】:

    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 2013-08-06
    • 2017-05-10
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多