#これで上述のエラーは回避できるようです。
#diff --git a/ext/net/net.c b/ext/net/net.c
index f05a7a3..04edcd6 100644
--- a/ext/net/net.c
+++ b/ext/net/net.c
@@ -104,7 +104,11 @@ ScmSocket *make_socket(Socket fd, int type)
ScmObj Scm_MakeSocket(int domain, int type, int protocol)
{
intptr_t sock;
+#if defined(GAUCHE_WINDOWS)
+ SCM_SYSCALL(sock, WSASocket(domain, type, protocol, NULL, 0, 0));
+#else
SCM_SYSCALL(sock, socket(domain, type, protocol));
+#endif
if (SOCKET_INVALID(sock)) Scm_SysError("couldn't create socket");
return SCM_OBJ(make_socket((Socket)sock, type));
}
#私も充分に理解できていないのですが、こういう記事を見付けてそのまま適用してみたらうまくいった次第です。 http://mimizun.com/log/2ch/tech/1102427855/238 #ありがたい。よく見つかりましたね。
#フラグの有無はともかく、メインスレッドとそれ以外で差が出るってのがよくわからないとこではありますが。
#試しにこういうサンプルを作ってみたんですが、 socket を使うとスレッドを使わなくてもエラーになりました。 http://ja.pastebin.ca/2109892 #なぜ Gauche では (メインスレッドなら) 動いていたのかよくわかりませんね。
#確かに。動くはずのないものが動いてたってのも気持ち悪いなあ。
#socket()で作ったハンドルがOVERLAPPEDなのはWinSockの伝統ですね。。
#(ReadFileとかでSocketを扱えるようになったのが確かWinsock2からなので)
#WinSock時代はソケットの読み書きはsend,recvだけでやってたとかそういうことなのかな?
#基本的にはReadFileとかWriteFileに渡すのが(winsock的には)拡張なので、そういうことをするなら注意しろというデザイン。
#スレッドが無い状況だとoverlapped I/Oは唯一の非同期I/O手段なので、多分WSAASync~みたいなwinsockの関数は内部的にoverlapped I/Oを使っていて、sendとかrecvはそれを隠蔽しているんだと思います。
#なるほど。NT以前の時代に非同期ネットワークI/Oをやるための策が(デフォルトとして)ずっと残ってるって感じですかね。