TcpListener を使用しているときに「クライアントの切断」を検出する方法を探していました。
すべての答えは次のようなものです: TcpListener: クライアントの切断を検出するにはどうすればよいですか?
基本的に、ストリームから読み取り、Read() が 0 を返す場合、クライアントは切断されています。
ただし、これは、クライアントがデータ ストリームを送信するたびに切断することを前提としています。私たちは、TCP の接続/切断のオーバーヘッドが遅く高価な環境で運用しています。
接続を確立してから、多数のリクエストを送信します。
擬似コード:
client.Connect();
client.GetStatus();
client.DoSomething();
client.DoSomethingElse();
client.AndSoOn();
client.Disconnect();
Connect と Disconnect() の間の各呼び出しは、データのストリームをサーバーに送信します。サーバーは、ストリームを分析および処理する方法を知っています。
切断せずに TcpListener をループで読み取らせた場合、すべてのメッセージを読み取って処理しますが、クライアントが切断された後、サーバーはそれを知る方法がなく、クライアントを解放して新しいメッセージを受け入れることはありません。
var read = client.GetStream().Read(buffer, 0, buffer.Length);
if (read > 0)
{
//Process
}
read == 0 のときに TcpListener にクライアントをドロップさせると、データの最初のストリームのみを受け入れ、直後にクライアントをドロップします。
もちろん、これは新しいクライアントが接続できることを意味します。
呼び出し間に人為的な遅延はありませんが、コンピューター時間に関しては、2 つの呼び出し間の時間はもちろん「巨大」であるため、クライアントが持っている、またはすべきではないことを意味しなくても、常に read == 0 の時間が存在します。切断されます。
var read = client.GetStream().Read(buffer, 0, buffer.Length);
if (read > 0)
{
//Process
}
else
{
break; //Always executed as soon as the first stream of data has been received
}
だから私は疑問に思っています...クライアントが切断されたかどうかを検出するより良い方法はありますか?