2009-04-13 6 views
1

テスト・ケースを返します。マイ接続されているが、常に真

  1. 接続を開始する前に、それは
  2. 接続が
  3. 接続は、クライアントのリターンによって閉鎖され、他端リターンによって閉鎖されて返す必要がありますfalse
  4. データが使用できない場合でも接続されます。返信tr UE

    class MyConnection 
    { 
        //Assume I have all initialization for _socket 
        public bool IsConnected() 
        { 
         return !(_socket.Poll(1, SelectMode.SelectRead) 
                && _socket.Available == 0); 
        } 
        private Socket _socket; 
    

    }

    class Test 
    { 
        static void Main(string[] args) 
        { 
         MyConnection my = new MyConnection() 
         if(my.IsConnected()) 
          /*always return true even when I am not connected*/;  
        } 
    } 
    

ことを防ぐために、どのように任意のアイデア?


はこれまでのところ、答えのいずれもが満足ではなかった....以下を行うことができます

public bool IsConnected() 
     { 

      bool bConnected = false; 
      bool bState = _socket.Poll(1, SelectMode.SelectRead); 
      try 
      { 
       if (bState && (_socket.Available == 0)) 
        bConnected = false; 
       else 
        bConnected = true; 
      } 
      catch (SocketException) 
      { 
       //_socket.Available can throw an exception 
       bConnected = false; 
      } 

      return bConnected; 
     } 
+0

ネットワークケーブルを引き出しますか? :-) – paxdiablo

+0

あなたが実際に達成しようとしているものを投稿すると、より実りあるかもしれません。 –

答えて

1

私はあなたが達成しようとしている正確に何か分かりません、しかし、あなたは接続が切断されたかどう伝えようとしていると仮定すると、この記事は役に立つかもしれ:

How can I tell if the connection has been broken in my sockets based client?

編集:トラブルシューティングの手順では、2つのブール式のうちどれがfalseを返すか、どちらがfalseを返すかを判断することができます。

+0

それは私のポストだった!解決策は不完全です:) –

+0

lol!十分に公正で、私はそれが似ていた理由があったと思う - 私は著者をチェックすべきだった。 –

3

私はあなたの_socket.Poll()コールは後方にあると思います。ポーリングが失敗すると、メソッドはfalseではなくtrueと評価されます。これを試してみてください:

public bool IsConnected() 
{ 
    return !(!_socket.Poll(1, SelectMode.SelectRead) 
           && _socket.Available == 0); 

} 

私もそれがこのチェックの_socket.Available一部を作るために良いアイデアだか分かりません。 documentationによると、戻り値0は、「データがネットワークバッファにキューイングされていません」という意味です。これは、接続されたソケットであっても非常に簡単です。

+0

ソケットがこの2つのシナリオで接続されているかどうかを確かめてください: 1)接続開始前 2)接続が壊れた後 –

+0

それはできません:_socket.Availableに関する私のメモを参照してください。しかし、それはあなたの現在のコードを上回る改善です。条件#1のために、あなたのクラスのプライベートメンバーをチェックしておきます。 #2の場合は、.Pollが適切か、そうでないかのどちらかです。 –

+0

ジョエル、私は改善が必要ない、私は完全に動作するソリューションを好むだろう。しかし、努力をありがとう.... –

0

Socketクラスから期待している機能が得られないようです。私の理解では、Socketクラスは最後のソケット操作時の接続状態のみを認識しています。 Poll methodはいくつかの制限があり

注:この方法は、壊れたネットワーク・ケーブルなどの接続の問題の特定の種類を検出し、またはリモートホストが不正にシャットダウンされたことはできません

。これらの種類のエラーを検出するには、データの送受信を試みる必要があります。

これは、正常でない切断が発生した場合、次のソケット操作がタイムアウトするまでソケットが正常に報告され続けることを意味します(以前のこれに投稿する)。

これは、正常でない接続を検出したい場合は、previous answerで示唆されているように、アプリケーションレベルのハートビート/ pingを実装する必要がある可能性が高いことを意味します。 pingの間隔でプレイする必要があるかもしれません。そうしないとフォールトトレランスが失われ、遅れのスパイクは望ましくない切断の報告を引き起こす可能性があります。

関連する問題