1

サーバー/クライアント アプリがあります。

どちらも通信時に BinaryReader/Writer を使用します。

クライアントとサーバーがメッセージを迅速に交換している場合、特定の秒に多くのメッセージが送信され、ほとんどの場合 (常にではありませんが) サーバーをシャットダウンします (組み込みコマンドを使用して、正常なシャットダウンを行います)。クライアントの BinaryReader.ReadString() メソッドは、 EndOfStreamException、これで問題ありません。私が理解できないのは、この例外が TcpClient.Connected プロパティを「false」に変更しないのはなぜですか?

while(true){
   try{
      BinaryReader.ReadString()
   }
   catch(IOException){
     if(!TcpClient.Connected)
        break;
     //BinaryWriter.Write() - this will, eventually, change Connected property to 'false'
   }
}

これは無限にループします。ネットワークの読み取り/書き込みが失敗すると、Connected プロパティが変更されると思いました。BinaryReader が例外をスローしている場合、正常に読み取られていませんか?

BinaryWriter.Write() をスローすると、Connected プロパティが「false」に変更されるため、無限ループが壊れます。

関連する質問ですが、EndOfStreamException は常にネットワーク接続の切断を示していますか、それとも一時的な問題を意味している可能性がありますか?

4

1 に答える 1

2

意図的に。TcpClient.Connected の MSDN ライブラリ記事の備考セクションから:

Connected プロパティは、最新の操作の時点での接続の状態のみを反映するため、現在の状態を判断するには、メッセージの送受信を試みる必要があります。メッセージの送信が失敗すると、このプロパティは true を返さなくなります。この動作は仕様によるものであることに注意してください。テストと送受信の間に接続が失われた可能性があるため、接続の状態を確実にテストすることはできません。コードは、ソケットが接続されていることを想定し、失敗した送信を適切に処理する必要があります。

あなたが発見した回避策は正しいものです。

于 2011-10-06T22:58:30.890 に答える