1つのクライアントのみを受け入れることができるC#でサーバーを開発していますが、別の接続要求を受け入れることができるようにするには、このクライアントがいつ切断されるかを知る必要があります。
クライアントとの接続要求を継続的にリッスンし、Socket.BeginAccept
クライアントを受け入れるか拒否する最初のソケットを使用しています。クライアントが受け入れられると、によって返される新しいソケットがSocket.EndAccept
クライアントとサーバー間の通信に使用されます。次に、サーバーはクライアントからのコマンドを待機し、Socket.Begin/EndReceive
応答を送信します。サーバーはTelnetのようなプロトコルを使用します。つまり、各コマンドと応答の各行はで終わる必要があり\r\n
ます。
クライアントが切断されているかどうかを検出するために、500ミリ秒ごとに空のメッセージ( " \r\n
")をクライアントに送信するタイマーをインストールしました。クライアントが切断されると、ソケットによって例外がスローされます。この例外は、現在のセッションを閉じて新しい接続を受け入れるサーバーによってキャッチされます。このソリューションは堅牢ですが、ネットワーク上の不要なトラフィックを意味し、実際の応答を取得する前にダミーメッセージをフィルタリングする必要があるクライアントによって正しく処理される必要があります。
空のバッファ()を送信しようとしましたSocket.Send(new byte[1], 0, 0)
が、server->clientの方向で機能しないようです。
Socket.EndReceive
別の解決策は、 0バイトを返す場合を処理することかもしれません。これは、「アイドル」時間中に発生する切断の場合に正常に機能します。ただし、メッセージ転送中にクライアントが切断された場合、サーバーは常にそれを認識しているわけではなく、無期限に待機します。
私はすでにこの問題に関するいくつかのスレッドと質問を見てきましたが、良い解決策を見たことがありません。
だから私の質問は:.Netで切断を検出するための最良の方法は何ですか?