From: Tanaka Akira Date: 2009-01-02T00:44:13+09:00 Subject: [ruby-dev:37674] [Bug:trunk] Socket.getaddrinfo("www.ruby-lang.org", 80) returns only UDP information 1.9 と 1.8 で Socket.getaddrinfo("www.ruby-lang.org", 80) の返り値が違います。 以下のように、1.9 では 1要素の配列が返り、1.8 では 2要素の配列が返ります。 % ./ruby -rpp -rsocket -ve 'pp Socket.getaddrinfo("www.ruby-lang.org", 80)' ruby 1.9.1 (2009-01-01 patchlevel-5000 trunk 21253) [i686-linux] [["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68", 2, 2, 17]] % ruby-1.8 -rpp -rsocket -ve 'pp Socket.getaddrinfo("www.ruby-lang.org", 80)' ruby 1.8.7 (2008-12-26 revision 21066) [i686-linux] [["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68", 2, 1, 6], ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68", 2, 2, 17]] 1.8 の返り値の 2要素はよく似ていますが、 「第5要素 - ソケットタイプに対応するInteger」と 「第6要素 - プロトコルに対応するInteger」が異なっています。 これがなにかというと、1, 6 は TCP を意味していて、2, 17 は UDP を意味しています。 % ./ruby -rsocket -e ' p [Socket::SOCK_STREAM, Socket::IPPROTO_TCP] p [Socket::SOCK_DGRAM, Socket::IPPROTO_UDP]' [1, 6] [2, 17] 1.9 では、2, 17 の要素しかなくて、これはつまり UDP の情報し か返ってきていないということを意味します。 www.ruby-lang.org:80 の情報を要求して TCP が出てこないのはよ ろしくないんじゃないでしょうか。 調べてみると、r20387 の Fri Nov 28 18:31:21 2008 Yukihiro Matsumoto * ext/socket/socket.c (sock_s_getaddrinfo): refactored to remove code duplication regarding getaddrinfo. という変更が原因なようなのですが、挙動が変わってしまっている ので、リファクタリングとしては失敗ではないでしょうか。 -- [田中 哲][たなか あきら][Tanaka Akira]