2016-10-08 2 views
-1

私は少しのプログラムを作っています。クライアントの切断を処理しようとしています。クライアントが切断すると、彼はシャットダウンメッセージを送信し、それを処理します。しかし、クライアントが強制的に閉じられると(ネットワーク接続が失われ、タスクが強制終了され、例外が発生します)、サーバーは引き続きクライアントを接続していると見なします。 今、私はこの情報を直ちに更新しようとしています。クライアントがもはや接続されていなければ、彼は削除する必要があります。私は毎回彼にpingすることはできませんし、できますか?送信中で、私のpingコマンドに干渉している場合はどうなりますか?C#ソケット - クライアントが切断するかどうかを確認する方法

TL;私のクライアントがもう接続されていないかどうかを知りませんか?

+0

TCPは、多くのタイプの切断を検出しないようにするために設計されています。グレースフルクロージャ以外に、リモートエンドポイントがソケットを強制的に閉じた場合にのみ、エラーが発生します。また、ソケットに読み込み保留中の場合でもエラーが発生します。それ以外の場合は、ソケットに書き込まない限りエラーは検出されません。 TCPには定期的にソケットに書き込む "keep-alive"オプションが含まれているので、これを自動的に実行することができます。切断を検出しようとすると、TCPのフォールトトレランスの全ポイントが無効になるため、一般的には**悪い考え**です。 –

+0

質問の詳細な説明については、重複したマークを参照してください。 –

答えて

0

ソケットが正常にシャットダウンすると、シャットダウンメッセージ(読み込み時にゼロバイトが返されます)が表示されます。

リモートタスクが強制終了され、ソケットが正常にシャットダウンしていない場合(またはクライアントがいなくてもサーバがまだリッスンしている場合)は、「half open socket」となります。シナリオによってはこれらを検出するのが難しい場合があります。 TCP has a keep-alive mechanism(これは主に非モバイルネットワーク上で、また、有効になっている場合)を検出する必要があります。モバイル接続(特にflakey GPRS/Edge)では、キープアライブでさえ常に機能するとは限らず、データを送信しようとしても成功を返すだけであることがわかります。このシナリオでは、クライアントがあなたにデータを送信していない場合、自動タイムアウトで有効な接続を確立する必要があります。もちろん、クライアントが再接続しようとする状況は常にありますが、すでにソケットがあるようですそこに座ってください

0

これを試してください。わたしにはできる。

private static bool IsSocketConnected(Socket socket) 
{ 
    try 
    { 
     return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0); 
    } 
    catch (SocketException) { return false; } 
} 
+0

これはまた、読み込み可能なデータがなくてもソケットが私の知る限り接続されていればtrueを返します。それは私が正確に望むものではありません..しかし、ありがとう! –

関連する問題