サーバー上のクライアントソケットの切断を確実に検出する
サーバーの安定性と良好なユーザー エクスペリエンスを維持するには、クライアントの切断を効率的に検出できるかどうかにかかっています。 クライアントはさまざまな方法を使用してサーバーの切断を検出できますが、この記事では、クライアントがソケットから切断されたことをサーバーが迅速かつ確実に識別する方法に焦点を当てます。 従来のアプローチの限界を調査し、ポーリングを使用した堅牢なソリューションを紹介します。
シナリオ: サーバーは、Socket オブジェクト (handler
と呼ばれる) を介してクライアント接続を受け入れました。課題は、この handler
の切断を監視することです。
従来の方法が失敗する理由
handler.Available
、handler.Send
、または handler.Receive
などのプロパティをチェックするだけでは、サーバーの観点からクライアントの切断を検出するには不十分です。これらのメソッドは、このサーバー監視コンテキストでの切断を直接通知するように設計されていません。
ポーリング ソリューション: IsConnected()
拡張メソッド
組み込みのソケット切断イベントがないため、ポーリング メカニズムを採用しています。 IsConnected()
拡張メソッドは、Poll()
メソッドを使用してソケットの接続を確認します。
このメソッドは、短いタイムアウト (1 ミリ秒) で Poll()
と SelectMode.SelectRead
を呼び出します。 Poll()
が 0 に等しい handler.Available
呼び出しが成功した場合は、接続がアクティブであることを示します。 その他の結果は切断を示唆しています。
コードの実装と統合
この機能を統合するには、AcceptCallback
メソッドを変更します。
<code class="language-csharp">using SocketExtensions; public static void AcceptCallback(IAsyncResult ar) { // Accept the incoming connection Socket listener = (Socket)ar.AsyncState; handler = listener.EndAccept(ar); // Begin polling for disconnections Task.Run(() => { while (handler.IsConnected()) { // Process data while the client is connected } // Client disconnected Console.WriteLine("Client disconnected"); // Handle disconnection appropriately (e.g., cleanup resources) }); }</code>
結論: 信頼性の高い切断処理
IsConnected()
拡張メソッドは、サーバーがクライアントのソケット切断を検出するための信頼できる方法を提供します。 このプロアクティブなアプローチにより、接続中断に対する即時対応が可能になり、サーバーの安定性とシームレスなユーザー エクスペリエンスが確保されます。 リソースの解放やソケットのクリーンアップなど、切断イベントを適切に処理することを忘れないでください。
以上がサーバーはどのようにしてクライアントソケットの切断を効率的に検出できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。