Winsock の 非同期 connect() で、存在しないIPアドレスを指定します。
その場合、ネットワークの状態は SYN_SENT で一時停止することになります。
相手のポート開放待ちですね。
この状態は vista 以降の os では fport 類似コマンドの psr などで確認できます。
socket() 生成 → connect() をコールした後、
すぐに解放処理を行います。
connect_timeout( socket, … ); // connect() を行い、タイムアウトが発生
shutdown( socket, SD_SEND );
read = recv( socket, buf, 1, 0 ); // この場合は接続していないので必要無い
printf( "read: %d\n", read ); // 当然ですが -1 になります
shutdown( socket, SD_BOTH );
closesocket( socket );
ここまでは別に良いんですが…最後に
WSACleanup();
を呼ぶと、
20秒間、ブロッキングされます。
ミニ知識ですが、Windows 系の OS では、connect() のタイムアウト値を
計測したところ 20 秒です。vista sp2 では確実。
その20秒という値が経過しない間に、
解放処理を行い WSACleanup() を呼ぶとブロッキングされるようだ。
WSACleanup() のタイミング的には、めったに困らないんだけど…
ちょっと困りますね。
非同期処理のつもりなのに、WSACleanup() で 20秒ブロッキング
されるのは気持ち悪い。
ブロッキングが解除されるまで、プロセスが正常終了できない。
これを回避する手段は今のところ…見つかりません。うーん。
0 コメント:
コメントを投稿