2012-02-17 12 views
3

私はTcpClient Asynchronous WPFプロジェクトをリクエストしています。クライアントが切断されたときにソケットが切断されたためにネットワークが失われたときに、私はいくつかのコードを書きました。正常に動作し、ソケットがサーバー側でも取り外されたり取り外されたりすると、イベントが発生したり、クライアントのステータスを切断するための例外は発生しません。私は多くのサイトでこの問題について見てきましたが、どこでも人々はSocket.Pollメソッドを使用すると言っていましたが、私の場合は動作しません。 SelectMode.SelectReadは、クライアントが接続または切断されたときに常にtrueを返すので、私は何か別の方法を見つけることはできません。ネットワークが切断されたために切断されたTcpClientを見つけるための問題

クライアントのソケットが抜かれた/ネットワークアクセスが非同期モードで失われたときを見つける方法を知るためにここに質問を投稿しています。私はどのように動作していないか、次のコードで試しました。

void CheckSocketStatus() 
    { 
     try 
     { 
      while (true) 
      { 
       System.Threading.Thread.Sleep(1000); 
       if(!mobjClient.Client.Poll(0,SelectMode.SelectWrite)) 
       { 
        break; 
       } 
      } 
     } 
     catch(SocketException soex) 
     { 

     } 
    } 

誰かが私を助けることを望みます。

答えて

1

述べているdocumentationによって、これは、特定の接続の問題を検出するために使用することができないこと正しい:そのような壊れたネットワークケーブル、この方法は、接続の問題の特定の種類を検出することができない

、又はそのリモートホストが異常にシャットダウンされました。これらの種類のエラーを検出するには、データの送受信を試みる必要があります。

永続的な接続に頼るのではなく、必要に応じて開閉することを検討してください。それにもかかわらず、何らかの接続状態情報が必要な場合、不幸な結論は、基礎となるアーキテクチャがそれを提供しないということです。定期的にパケットを交換し、エラーを捕らえなければならないでしょう。 Connectedプロパティのみが最新の操作のような接続の状態を反映しているので、あなたが送信または受信しようとしなければならない

これがれるtcpClientのConnected財産上のドキュメントが示唆するものもあります現在の状態を判断するメッセージ。メッセージの送信が失敗した後、このプロパティはtrueを返さなくなりました。この動作は仕様です。テストと送信/受信の間に接続が失われた可能性があるため、接続の状態を確実にテストすることはできません。あなたのコードでは、ソケットが接続されていると想定し、失敗した送信を正常に処理します。

+0

ご回答いただきありがとうございます。どのように私はこの2日間最後に作業している。私はそれが動作するときにあなたに返信します。 –

+0

私が考えたことの1つですが、少し危険です。ポートスキャナに似たテクニックを使用することです。おそらく、確立された接続に影響を与えないが、もう一方のエンドポイントが応答する特定のパケットを送信できる方法をTCP標準で見つけることは可能です。あなたはあなたのチェックメソッドでこのプローブを作ることができます。しかし、私は何がわからないのですか?すでに確立されている接続を介してSYNパケットを送信すると発生します。このようなパケットは、相手側のアプリケーション層には届かないはずです。私は確かにあなたが見つける解決策に興味があるでしょう。 – Andreas

+0

今、私は正しいソリューションを見つけましたが、手動で管理する方法もあります。クライアントとの接続が切断されると、サーバー側では、関係者の接続も強制的に閉じています。 –

関連する問題