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 件のコメント:
コメントを投稿