代码之家  ›  专栏  ›  技术社区  ›  Sasha

我的断开总是返回true

  •  1
  • Sasha  · 技术社区  · 17 年前

    测试用例:

    1. 在连接开始之前,它应该返回
    2. 连接被另一端返回关闭
    3. 客户端返回关闭连接
    4. 即使没有可用的返回数据,也存在连接

      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;
            }
    
    3 回复  |  直到 17 年前
        1
  •  3
  •   Joel Coehoorn    17 年前

    我想你 _socket.Poll() 呼叫是向后的。如果投票失败,这将帮助该方法评估为true而不是false。试试这个:

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

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

        2
  •  1
  •   Community Mohan Dere    9 年前

    我不知道你到底想达到什么目的,但假设你想知道连接是否断了,这篇文章可能会有帮助:

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

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

        3
  •  0
  •   Community Mohan Dere    9 年前

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

    请注意 Poll method 有一些限制:

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

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

    这意味着,如果您想检测不正常的断开连接,您可能需要实现应用程序级别的heartbeat/ping,如 previous answer . 您可能需要使用ping之间的间隔,否则您将失去一定程度的容错能力,并且延迟尖峰可能会导致不需要的断开报告。

    推荐文章