2012-03-10 4 views
2

これには多くの情報があります。私はそれをすべて読んで約束しました。Socket.PollとSocket.Connectedを希望どおりに動作させることができません

私はラップトップで動作するソケットサーバープログラムを持っています。私は最大50のラップトップを同じLAN経由でサーバーにワイヤレス接続しています。クライアントラップトップはすべて(Socket.ConnectAsyncを使用して)サーバーに接続し、サーバーは非同期メソッドも使用してデータを送受信します。サーバーは、接続されているクライアントのラップトップの一覧をユーザーに表示します。この一覧は正確で、クライアントが切断して接続するたびにピックアップされます。しかし、クライアントラップトップは、特定の状況下でサーバーへの接続が失われたようなことはありません(サーバープログラムがクラッシュした場合、サーバーのラップトップがスタンバイモードになるなど)。接続5秒ごとに次のように:

 bool SocketConnected(Socket s) 
    {    
     bool part1 = s.Poll(0, SelectMode.SelectWrite); 

     bool part2 = (s.Available == 0); 
     if (!part1 && part2) 
     { 

      return false; 
     } 
     else 
     { 
      return true; 
     } 
    } 

私はすべてのselectmodes(SelectWrite、SelectRead、SelectError)を使用して試してみましたが、別のタイムアウト値を使用して試してみました。私はこれらの操作の後にs.Connected値をチェックしてみましたが、接続状態を判断するために他の方法を試してみましたが、何も信頼できる結果を出すものはありません!!私は、5秒ごとにダミーの情報を送ってsをチェックすることで、私が望む結果を達成できると思います。しかし、そうした後に接続しましたが、実際には各ラップトップが既に多くのデータをサーバーに送信しているので、 。どんな助けも大歓迎です!ありがとう

答えて

2

接続が有効かどうかを確認する唯一の信頼できる方法は、相手先に何かを送信し、到着しているかどうかを確認することです。これは、時々 "ping"値を送受信したり、KeepAlive socket optionを有効にすることで自動的に行うことができます。

1

Socket.PollのためのMSDNドキュメントは、正確な状況について非常に明示的です(サーバがクラッシュし、スタンバイが)あなたが言及した:

、このような壊れたネットワークケーブルなどの接続問題、特定の種類を検出できないこの方法、またはリモートホストが正常に終了していないことを確認してください。 これらの 種類のエラーを検出するには、データを送受信する必要があります。

関連する問題