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

在中检测客户端断开连接的最佳做法。网?

  •  8
  • cedrou  · 技术社区  · 17 年前

    Socket.BeginAccept 并接受或拒绝客户。当客户端被接受时,返回的新Socket Socket.EndAccept Socket.Begin/EndReceive 并发送响应。服务器使用类似Telnet的协议,这意味着每个命令和每一行响应都必须以 \r\n .

    为了检测客户端是否已断开连接,我安装了一个计时器,每500毫秒发送一条空消息(“ “)发送到客户端。如果客户端断开连接,Socket会抛出异常。此异常由关闭当前会话并接受新连接的服务器捕获。此解决方案是稳健的,但意味着网络上不需要的流量,客户端必须正确处理,在获得实际响应之前必须过滤虚拟消息。

    Socket.Send(new byte[1], 0, 0) ),但这似乎在方向服务器上不起作用>客户。

    Socket.EndReceive

    我已经看到了关于这个问题的几个线索和问题,但我从未见过任何好的解决方案。

    所以我的问题是:检测中断开连接的最佳方法是什么。网?

    4 回复  |  直到 17 年前
        1
  •  5
  •   Chris Chilvers    17 年前

    唯一的另一种选择是,如果是TCP,则让TCP每隔一段时间发送一次keep-alive,这仍然是轮询,比如你现在在做什么,但在TCP层处理,所以你的协议不需要知道。

        2
  •  3
  •   Community Mohan Dere    9 年前

    您可以使用以下方法查找客户端是否仍处于连接状态。这

    public static bool IsConnected(this TcpClient client)
    {
        try
        {
            bool connected = !(client.Client.Poll(1, SelectMode.SelectRead) && client.Client.Available == 0);
    
            return connected;
        }
        catch
        {
            return false;
        }
    }
    

    answer 用于测试套接字,这就是我获得代码片段的方式。

        3
  •  0
  •   feroze    17 年前

    你对客户有控制权吗?如果是这样,你不能让客户端向服务器发送一个特殊的数据包,说它正在断开连接,然后断开套接字吗?

    您是否试图检测客户端实际断开连接的情况(使用Socket.Shutdown()或Socket。Close())或者客户端是否长时间处于空闲状态,因此需要被弹出?

    推荐文章