我的IsConnected始终返回true

时间:2009-04-13 13:31:49

标签: c# .net sockets

试验例:

  1. 在连接开始之前,它应该返回 false
  2. 连接由其他结束返回 false
  3. 关闭
  4. 客户端返回 false
  5. 关闭连接
  6. 即使没有数据可用,也存在连接 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*/;    
       }
    }
    
  7. 任何想法如何预防?


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

    可以做到以下几点:

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

3 个答案:

答案 0 :(得分:3)

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

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

}

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

  

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

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

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