non-blocking socketには、WSA_FLAG_OVERLAPPEDが必要

Pocket

なのだそうです。MSのKBに書いてあった。
そうでないと、WSAConnectがWSAEINVALを返すそうな…。道理でつながらないわけだ。ノンブロッキング動作には、socket()関数ではなくて、WSASocket()関数でソケットを作らないといけないということですね。
実際にconnectで調べてみると、最初はWSAEWOULDBLOCKが返って、次はWSAEINVALになる。やっぱりconnectを2回呼び出してはいけないみたい。あまり関係ないのかなあ。
これは、Winsock FAQに書いてあってもいい情報だと思うけど。
overlapped structure やcompletion functionをNULLにしておけば、ブロッキングと同じ動作にすることができるのだそうです。でも、CreateFileのところには、Overlapped動作のときはNULLにしてはいけないと書いてあったと思う。なんか複雑。
http://support.microsoft.com/kb/179942/EN-US/
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q181611

Pocket

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください