From: info@... Date: 2006-06-25T04:27:31+09:00 Subject: [ruby-dev:28838] Re: udp test with ruby 1.8.5 preview1 on cygwin 下記の通り Winsock2 を使わずにC言語でプログラムを書いて、空パケットを投 げたところ届きませんでした。 $ cat udptest-unix.c #include #include #include #include int main(int argc, char *argv[]) { int fd; struct sockaddr_in sin; char *addr = "127.0.0.1"; fd = socket(AF_INET, SOCK_DGRAM, 0); sin.sin_family = PF_INET; sin.sin_port = htons(atoi(argv[1])); inet_aton(addr, &(sin.sin_addr)); sendto(fd, "a", 1, 0, (struct sockaddr *)&sin, sizeof(sin)); close(fd); return 0; } よって送出できないのは cygwin が悪いということになるのでしょうかね... 空ではないパケットについては届きました。 > ruby が 0.0.0.0 で待ち受けて、C言語プログラムで 127.0.0.1 に空パケットを > 投げても届きました。 > > あれこれやったのを纏めるとこんな感じのようです。 > > ■空パケット > 受信側 送信側 > × cygwin-ruby 0.0.0.0 cygwin-ruby 0.0.0.0 > × cygwin-ruby 0.0.0.0 cygwin-ruby 127.0.0.1 > × cygwin-ruby 127.0.0.1 cygwin-ruby 127.0.0.1 > × cygwin-ruby 0.0.0.0 C言語 0.0.0.0 > ○ cygwin-ruby 0.0.0.0 C言語 127.0.0.1 > ○ cygwin-ruby 127.0.0.1 C言語 127.0.0.1 > × mswin32-ruby 0.0.0.0 mswin32-ruby 0.0.0.0 > ○ mswin32-ruby 127.0.0.1 mswin32-ruby 127.0.0.1 > > ■非空パケット > 受信側 送信側 > × cygwin-ruby 0.0.0.0 cygwin-ruby 0.0.0.0 > ○ cygwin-ruby 0.0.0.0 cygwin-ruby 127.0.0.1 > ○ cygwin-ruby 127.0.0.1 cygwin-ruby 127.0.0.1 > ○ cygwin-ruby 0.0.0.0 C言語 127.0.0.1 > ○ cygwin-ruby 127.0.0.1 C言語 127.0.0.1 > > 纏めると > 1. 0.0.0.0 に送信することは出来ない。 > 2. cygwin-ruby は空パケットを送出できない。 > > なんですかね... > >> Cで書いたプログラムで127.0.0.1に向かって空データを送ったところ無事届きま >> した。 >> 0.0.0.0 はダメでした。 >> >> 127.0.0.1 については送出側の問題ということになるのでしょうかね。 >> ---------------------------------------------------------------------- >> $ /usr/local/ruby-1.8.5-preview1/bin/ruby -rsocket -ve ' >> u = UDPSocket.new >> u.bind("127.0.0.1", 0) >> p u.recv(10) >> ' >> ruby 1.8.5 (2006-06-22) [i386-cygwin] >> "" >> ---------------------------------------------------------------------- >> $ cat udptest.c >> #include >> #include >> #include >> int main(int argc, char *argv[]) { >> WSADATA wsaData; >> SOCKET Socket; >> SOCKADDR_IN Addr; >> char* Buf = "a"; >> >> WSAStartup(MAKEWORD(2,2), &wsaData); >> Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); >> Addr.sin_family = AF_INET; >> Addr.sin_port = htons(atoi(argv[1])); >> Addr.sin_addr.s_addr = inet_addr("127.0.0.1"); >> sendto(Socket, Buf, 0, 0, (SOCKADDR*)&Addr, sizeof(Addr)); >> closesocket(Socket); >> WSACleanup(); >> return 0; >> } >> >> $ gcc udptest.c -lwsock32 >> In file included from udptest.c:3: >> /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/winsock2.h:103:2: >> warning: #warning "fd_set and associated macros have been defined in >> sys/types. >> This may cause runtime problems with W32 sockets" >> >> $ ./a.exe 4231 >> >>> send の第一引数が mesg なので変わって当然でした orz >>> 空だとダメですね. >>> >>> $ /usr/local/ruby-1.8.5-preview1/bin/ruby -rsocket -ve ' >>>> u1 = UDPSocket.new >>>> u2 = UDPSocket.new >>>> u1.bind("127.0.0.1", 0) >>>> u2.send("", 0, u1.getsockname) >>>> p u1.recv(10) >>>> ' >>> ruby 1.8.5 (2006-06-22) [i386-cygwin] >>> >>> -e:6:in `recv': Interrupt >>> from -e:6 >>> >>> $ /usr/local/ruby-1.8.5-preview1/bin/ruby -rsocket -ve ' >>> u1 = UDPSocket.new >>> u2 = UDPSocket.new >>> u1.bind("127.0.0.1", 0) >>> u2.send("a", 0, u1.getsockname) >>> p u1.recv(10) >>> ' >>> ruby 1.8.5 (2006-06-22) [i386-cygwin] >>> "a" >>> >>> $ /usr/local/ruby-1.8.5-preview1/bin/ruby -rsocket -ve ' >>> u1 = UDPSocket.new >>> u2 = UDPSocket.new >>> u1.bind("", 0) >>> u2.send("a", 0, u1.getsockname) >>> p u1.recv(10) >>> ' >>> ruby 1.8.5 (2006-06-22) [i386-cygwin] >>> -e:5:in `send': Cannot assign requested address - send(2) >>> (Errno::EADDRNOTAVAIL) >>> >>> from -e:5 >>> >>>> In article <449D66EC.8050405@cyanet.jp>, >>>> info@cyanet.jp writes: >>>> >>>>> bind するアドレスを 127.0.0.1 にすると cygwin でも戻ってきますが、結果が >>>>> 違いますね。 >>>> >>>>> u2.send("127.0.0.1", 0, u1.getsockname) >>>> >>>> 送るデータが "127.0.0.1" になってますが、ここが "" だとどう >>>> でしょう。