0

簡単に言えば、TimedOut 例外がキャッチされた後にソケットを再利用することは可能ですか? どうすればいいですか?

長い話:

2 つのスレッドがあり、どちらも同じソケットを使用しています。1つはリモートサーバーにパケットを送信し(スレッドAと呼びましょう)、もう1つ(スレッドB)は送信されたパケットの確認パケットをリッスンしています。スレッド A は、何らかの条件が満たされたときに ( で) 一時停止し、 aが続行するのをMonitor.Wait待ちます。Monitor.Pulseスレッド B がパケットを受信すると、それが呼び出さMonitor.Pulseれ、スレッド A が引き続き処理を行います...

問題は、パケットが失われる可能性があり、スレッド A がパルスを待っている間に受信しないパケットをスレッド B が無期限に待機することです。プログラム全体が「ブロック」されます。私が最初に考えたのは、受信タイムアウトを設定し、関連する例外をキャッチすることでした。それが発生すると、Monitor.Pulseスレッド B が別のパケットを待機している間、スレッド A を続行できます。

しかし、これはうまくいきません。例外がキャッチされると、スレッド A が同じソケットを使用しているため、スレッド A が新しいパケットを送信しようとすると、ソケットが閉じてアプリがクラッシュします。

この動作を防ぐにはどうすればよいですか?

4

2 に答える 2

1

問題は、パケットが失われる可能性があることです

いいえ、できません。TCP はパケットを失いません。パケットが失われている場合は、コードにバグがあるか、送信者がパケットを送信していません。ここではまだ問題ありません。

例外がキャッチされると、ソケットが閉じます

いいえ、そうではありません。閉じるときだけ閉じます

同じソケットを使用しているため、スレッド A が新しいパケットを送信しようとすると、アプリがクラッシュします。

タイムアウト例外をキャッチしたときにソケットを閉じた場合のみ。だから、それをしないでください。

この動作を防ぐにはどうすればよいですか?

タイムアウト例外をキャッチしたときにソケットを閉じないでください。

于 2016-05-22T02:05:48.587 に答える