著作一覧 |
どんどん増える、まるで医療費のようだというトートロジー。
なにかというと、「AとBなら自由を選ぶ」と口をついて出ている自分に気づく。まさにGPL汚染(いや、GPL感染か)。
Ruby-1.5でOK、1.6でOK、1.7でだめぽ(1.9.1も)のパターンを見つけたのだが、ちょっと追っかけたところ、なかなかおもしろいので後でじっくり見ようかなとか。
win32固有の話で、たぶん、Winsock2がからんでいるのだと思う。
というか(後で見ようと思いながらデバッガを起動していたり)、WSAEnumProtocolだな。
->WSAENOBUFF
やり直し
protocols_available -> 8 (af = 2 AF_INET, protocol = 1 (ICMP) type = 3 (SOCK_RAW) 2-6(tcp)-1 2-17(udp)-2 23-6-1 23-17-2 23-6-1 2-6-1 23-17-2 2-17-2
……確かに無い(というか、取りなおすと値が変わるような)。
というか、これはおかしいなぁ。MSDN読むと
If the lpProtocolInfo is not NULL, the socket will be bound to the provider associated with the indicated WSAPROTOCOL_INFO structure.
NULLを許容している(つまり列挙できないものがある前提)。
*** win32.c~ Fri Jun 06 19:39:57 2008 --- win32.c Thu Nov 13 20:55:47 2008 *************** open_ifs_socket(int af, int type, int pr *** 2633,2638 **** --- 2633,2639 ---- WSAEnumProtocols(NULL, proto_buffers, &proto_buffers_len); if (protocols_available != SOCKET_ERROR) { int i; + WSAPROTOCOL_INFO *pinfo = NULL; for (i = 0; i < protocols_available; i++) { if ((af != AF_UNSPEC && af != proto_buffers[i].iAddressFamily) || (type != proto_buffers[i].iSocketType) || *************** open_ifs_socket(int af, int type, int pr *** 2642,2650 **** if ((proto_buffers[i].dwServiceFlags1 & XP1_IFS_HANDLES) == 0) continue; ! out = WSASocket(af, type, protocol, &(proto_buffers[i]), 0, 0); break; } } free(proto_buffers); --- 2643,2652 ---- if ((proto_buffers[i].dwServiceFlags1 & XP1_IFS_HANDLES) == 0) continue; ! pinfo = &(proto_buffers[i]); break; } + out = WSASocket(af, type, protocol, pinfo, 0, 0); } free(proto_buffers);
で、うまく動いた(icmpping.rbの話)。
さて
ジェズイットを見習え |