From: Yukihiro Matsumoto Date: 2006-10-30T11:49:41+09:00 Subject: [ruby-dev:29706] Re: Socket.gethostbyname まつもと ゆきひろです In message "Re: [ruby-dev:29705] Socket.gethostbyname" on Sun, 29 Oct 2006 18:14:30 +0900, Kazuhiro NISHIYAMA writes: |http://www.atdot.net/~ko1/w3ml/w3ml.cgi/mandiff@ruby/msg/2418 || irb(main):009:0> Socket.unpack_sockaddr_in(Socket.gethostbyname("210.251.121.214")[3])[1] || - "210.251.121.214" || + SocketError: getnameinfo: ai_family not supported || + from (irb):1:in `unpack_sockaddr_in' || + from (irb):1 || | |リファレンスマニュアルの方でこんな変更がされていたのですが、 | |http://www.ruby-lang.org/ja/man/?cmd=view;name=Socket#Socket.2egethostbyname || 第四要素のホストのアドレスは、各アドレスタイプに対応する C の || アドレス構造体を pack した文字列として表現されています。例えば || アドレスタイプが AF_INET (定数 2) ならば Socket.unpack_sockaddr_in || で unpack できます。 | |という説明と、実際にかえってきている値が食い違っているようです。 |どちらが正しいのでしょうか? unpackできるというドキュメントが間違いです。 unpack_sockaddr_inのunpack対象はpackされたsockaddr_in構造体 ですが、gethostbynameが返すhostentの第4要素はpackされたIPア ドレスです。 sockaddr_in構造体を返すべきだ、という話はありえるのかもしれ ませんが、少なくとも現状ではhostent構造体との互換性を意図し てpackしたIPアドレスを返してます。 別解としてはunpack_sockaddr_inがpackされたIPアドレスも解釈す べきと言うのもありえるかもしれません。種別はどうせ文字列長で 判別可能ですし。 まつもと ゆきひろ /:|)