これには、2つの自動化された単体テストが含まれます。それぞれが非ブロッキングソケットを作成するtcp / ipサーバーを起動し、データを接続してダウンロードするクライアントのselect()のループでbind()とlisten()を実行します。
問題は、個別に実行すると完全に機能することですが、テストスイートとして実行すると、2番目のテストクライアントはWSACONNREFUSEDとの接続に失敗します...
そうでもなければ
それらの間に数秒のThread.Sleep()がありますか?? !!!
興味深いことに、障害が発生した後は、接続のために1秒ごとに再試行ループがあります。したがって、2番目のテストは10分後にタイムアウトするまでしばらくループします。
その間、netstat -naは、サーバーソケットの正しいポート番号がLISTEN状態にあることを示します。それで、それがリッスン状態にある場合はどうなりますか?なぜ接続を受け入れないのですか?
コードには、select NEVERがソケットを読み取る準備ができていないことを示すログメッセージがあります(つまり、リスニングソケットに適用されるときに接続を受け入れる準備ができていることを意味します)。
明らかに、問題は、ソケットの両端でclose()とshutdown()を意味する1つのテストを終了してから、次のテストを開始するまでの競合状態に関連している必要があります。
再試行ロジックによって、数秒後に最終的に接続が許可された場合、これはそれほど悪くはありません。しかし、それは「ぐちゃぐちゃになっている」ようで、再試行すらしません。
ただし、奇妙な理由で、リスニングソケットは、接続を拒否し続けても、リッスン状態にあると言います。
つまり、実際にSYNパケットをキャッチしてRSTパケット(「接続が拒否された」を意味する)を返すのはWindoze O/Sです。
私がこのエラーを目にしたのは、コードに問題があり、何百ものソケットがTIME_WAIT状態でスタックする原因となったときだけでした。しかし、ここではそうではありません。netstatは、任意の時点でTIME_WAITに1つまたは2つしかない約12個のソケットのみを表示します。
助けてください。