サーバー側ソケットクライアント切断監視
分散アプリケーションでは、システムの整合性を維持するためにクライアントの切断をタイムリーに検出することが重要です。ただし、クライアントがイベントまたはコールバックを使用してサーバーに通知できるのとは異なり、サーバーはクライアントの終了をプロアクティブに識別するという課題に直面しています。
検出方法
次の方法は、サーバーソケットでのクライアントの切断を検出するのに効果がないことが証明されています:
handler.Available
: このメソッドは読み取り可能なバイト数を返しますが、これは切断を示すものではありません。 handler.Send
: クライアントが切断されている場合、データの送信は失敗しますが、これは破壊的なテストであり、再接続の試行中にエラーが発生します。 handler.Receive
: 同様に、クライアントが接続されていない場合、データを受信しようとすると例外が発生します。 拡張メソッドを使用したポーリング
ソケット切断専用のイベントがないため、定期的なポーリングを推奨します。このプロセスを簡素化するために、拡張メソッドを作成できます:
<code class="language-csharp">static class SocketExtensions { public static bool IsConnected(this Socket socket) { try { return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0); } catch (SocketException) { return false; } } }</code>
このメソッドは、Poll
メソッドを利用してデータの可用性を確認します。ポーリングは成功したが、Available
が 0 を返した場合、これは接続が切断された可能性があることを示します。これは、送信操作中に SocketException
をキャプチャすることで確認できます。
以上がサーバーはソケット上のクライアントの切断をどのように検出できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。