過去の投稿記事 new!
・【画像】漫画でわかる外国人参政権
・東京電力のHPで停電状態が確認できたり(サービス再開!)
・戦国時代 ~ 江戸時代の徳川家康が熱かった
・vaio のバッテリは寿命が短いような気がする
・話題の Western Digital 製 WD20EARS を購入した
・C01LC をビックカメラで買ってきた
・2025年には空中都市が現実化?!
・【動画】わかりやすい「宇宙ひも理論」
・今世紀には「富士山噴火」「東海連動地震」「首都圏直下型地震」か?
・滅びた町、南浜町が Googleストリートビューで見れる

【 amazon 送料無料キャンペーン 】

バックリンクはご自由にどうぞ!     http://mfsocket.blogspot.com/feeds/posts/default?alt=rss リンク集 / ログイン

2010/07/03
WinSock の非同期 connect() の仕様?

 
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 コメント:

  • コメントには <b>, <strong>, <em>, <i>, <a> など一部の HTML タグを使用できます。