| 著作一覧 |
どんどん増える、まるで医療費のようだというトートロジー。
なにかというと、「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の話)。
さて
ジェズイットを見習え |