ネットワークプログラミング相談室 Port12

このエントリーをはてなブックマークに追加
238210
>>213
そんなバカなと思って、いろいろ試したら
ReadFile(ReadFile((HANDLE)socket, buf, sizeof buf, &read_size, NULL)
するとERROR_INVALID_PARAMETERで失敗するのね。

MSDNのReadFileの説明にはsocketが適応できるようなことかいてあるし、
ERROR_INVALID_HANDLEでないから、どこかパラメータが気に入らないんだろうと
あれこれやっていたら、なんとReadFile()の最後の引数にOVERLAPPED構造体を
指定してやるとOKになることがわかった。
Cランタイムルーチンでもおそらくこれが引っかかってるんだろう。
(Cランタイムルーチン内部ではReadFile()の呼び出しで
OVERLAPPED構造体をNULLにしている)

なぜ?と思ったら
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/default_state_for_a_socket_s_overlapped_attribute_2.asp
てなわけか。
socket()の呼び出しは、WSA_FLAG_OVERLAPPEDをセットする。。。
だからOVERLAPPED構造体を要求するのか。

なので、最初のsocket()の呼び出しを
WSASocket(AF_INET,SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0)
にしたらうまく行ったよ。
socketを_open_osfhandle()してfdopen()してfgets()で
改行までをバッファリングして戻るようになった。

しかしwinsockって、だせえ実装だな、おい。
なんでsocket()はWSA_FLAG_OVERLAPPEDをセットするんだ?
 >>microsoft