一尘不染

立即检测客户端与服务器套接字的断开连接

c#

如何检测到客户端已与服务器断开连接?

我有下面的代码在我的AcceptCallBack方法

static Socket handler = null;
public static void AcceptCallback(IAsyncResult ar)
{
  //Accept incoming connection
  Socket listener = (Socket)ar.AsyncState;
  handler = listener.EndAccept(ar);
}

我需要找到一种方法来尽快发现客户端已从handlerSocket 断开连接。

我试过了:

  1. handler.Available;
  2. handler.Send(new byte[1], 0, SocketFlags.None);
  3. handler.Receive(new byte[1], 0, SocketFlags.None);

当您连接到服务器并想检测服务器何时断开连接时,上述方法可以工作,但是 当您是服务器并想检测客户端断开 连接时,上述方法不起作用

任何帮助将不胜感激。


阅读 315

收藏
2020-05-19

共1个答案

一尘不染

由于没有事件可用于在套接字断开连接时发出信号,因此您将必须以可接受的频率对其进行轮询。

使用此扩展方法,您可以拥有一种可靠的方法来检测套接字是否断开连接。

static class SocketExtensions
{
  public static bool IsConnected(this Socket socket)
  {
    try
    {
      return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0);
    }
    catch (SocketException) { return false; }
  }
}
2020-05-19