2012-01-19 23 views
1

リモートソケットが切断されたかどうかを検出する方法はいくつかあります。ソケット接続の確認

現在、ソケットが接続されているかどうかを確認するためにこれを行います。何らかの理由で

public void CheckSocket() 
{ 
    try 
    { 
     bool test1 = s.Poll(_MicrosecondFaultTolerance, SelectMode.SelectRead); 
     bool test2 = (s.Available == 0); 
     if (test1 && test2) 
      _Active = false; 
    } 
    catch 
    { 
     _Active = false; 
    } 
} 

これは、最初のドロップに完全に何の質問が尋ねたたびに動作しますが、チェックがfalseに_Activeを設定していないため、クライアントは「切断」とみなされないことをした後。 Connectionをテストする方法や、より信頼性の高い結果を得る方法はありますか?

+0

[C#でソケットが接続/切断されているかどうかを確認する方法](http://stackoverflow.com/questions/2661764/how-to-check-if-a-socket-is-connected- cで切断された) –

答えて

2

ソケットの下の接続がいったん解除されると、ソケットを閉じなければならないので、 "最初のドロップ"の意味がわかりません。そのすべては、CheckSocket()機能の外で何をしているかによって異なります。しかし、すべてが正しく処理されていると仮定すると、ソケットのポーリングは、基底の接続がアイドル状態であれば確実に動作しません。

切断は、基本となるトランスポートにトラフィックがある場合にのみ検出されます。アイドル状態で接続が放棄された(閉じられていない)場合、静かにそこに永久に座ります。アイドル状態で放棄された接続を検出するには、setsockopt()SO_KEEPALIVEを使用します。 TCPはダミートラフィックを定期的に他の側と交換して、接続がまだ生きているかどうかをテストし、NATやその他の動的ルーティングルールがタイムアウトしないようにします。 TCPのデフォルトのタイムアウトであるため、ドロップを検出するのに30秒以上かかる場合があります。