0

プロパティを使用して TcpClient のタイムアウトを設定していTcpClient.ReceiveTimeoutます。メソッドが例外をスローするTcpClient.Read()と (「接続されたパーティが一定期間後に適切に応答しませんでした」) - 自然に - ミリ秒後にTcpClient.ReceiveTimeoutTcpClient.Connectedfalse を返し始めます。

それは正常ですか?これを防ぐ方法はありますか?例外を取得したいが、接続を開いたままにしておく。

4

1 に答える 1

1

それは正常な動作です。

この状況を回避するために、無限の受信タイムアウトを設定できます (無限がデフォルトです。ReceiveTimeout プロパティとして 0 を明示的に設定できます)。ただし、相手側にクライアントが実際に存在しない場合、プログラムの応答性に問題が生じる可能性があります。正確なユースケースによっては、接続の失敗をログに記録してから、新しい接続を作成する方がよい場合があります。

私が通常使用するパターンは次のとおりです(疑似コードっぽい。接続メソッドは通常、例外処理を使用してインライン化されます)。

while (!done)
{
    // Try to connect with a reasonable ReceiveTimeout
    connected = EstablishTheConnectionAndHandleAnyException();
    if (connected)
    {
        // Do useful work
        done = true;
    }
    else
    {
        // Receive timeout
        // If interactive, give the user an opportunity to abort
        //    by setting done = true
        // At least log the situation
    }
}
于 2012-12-17T17:34:45.473 に答える