1. ホーム
  2. .net

[解決済み] サーバーソケットからのクライアントの切断を即座に検出する。

2023-04-15 23:11:51

質問

クライアントがサーバーから切断されたことを検出するにはどうすればよいですか?

私は以下のコードを AcceptCallBack メソッドにあります。

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

からの接続が切れたことをできるだけ早く発見する方法を探す必要があります。 handler ソケットから切断されたことをできるだけ早く発見する方法を見つける必要があります。

試してみました。

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

上記のアプローチは、サーバーに接続しているときに、サーバーが切断されたときに検出したい場合に動作しますが、動作しません。 がサーバーであり、クライアントの切断を検出したい場合。

どんな助けでも感謝します。

どのように解決するのですか?

ソケットが切断されたことを知らせるイベントはないので、許容できる頻度でソケットをポーリングする必要があります。

この拡張メソッドを使用すると、ソケットが切断されたことを検出するための信頼性の高いメソッドを持つことができます。

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