[#14922] alias $gvar — Koji Arai <JCA02266@...>

新井です。

19 messages 2001/10/14

[#15006] Re: eval.c (rb_stack_check): prohibit recursive raising error — WATANABE Hirofumi <eban@...>

わたなべです。

13 messages 2001/10/26
[#15008] Re: eval.c (rb_stack_check): prohibit recursive raising error — Shugo Maeda <shugo@...> 2001/10/26

前田です。

[ruby-dev:14909] ext/socket h_addr_list

From: WATANABE Tetsuya <tetsu@...>
Date: 2001-10-11 07:36:37 UTC
List: ruby-dev #14909
渡辺哲也です。

相談なのですが、

TCPSocket.gethostbyname(hostname)

で、一つのホストが複数の IP address を持って
いる場合、うまくとれないようです。

急ぎで解決策を望むのではないのですが、とりあ
えずおしらせということで。

------------------------------
$ nslookup www.yahoo.com
Server:  省略
Address: 省略

Non-authoritative answer:
Name:    www.yahoo.akadns.net
Addresses:  216.115.102.78, 216.115.102.77, 216.115.105.2, 216.115.102.79
          216.115.102.80
Aliases:  www.yahoo.com
------------------------------

------------------------------
$ echo www.yahoo.com | ruby nslookup.rb 
["w8.snv.yahoo.com", [], 2, "216.115.102.80"]
216.115.102.80  w8.snv.yahoo.com
------------------------------

確認に使ったスクリプトです。

------------------------------
require 'socket'

while ip = gets
  ip.chop!

  begin
    arr = TCPSocket.gethostbyname(ip)
    p arr
    print "#{arr[3]}\t#{arr[0]}\n"
  rescue SocketError
    print "#{ip}\n"
  end
end
------------------------------

ext/socket/socket.c を読んでみたのですが、一
度「代表されるようなホスト名」から「IP
address」へ変換して、IP address を struct
hostent * の要素のh_addr_list から Array ク
ラスに push しようとしています。ですが、IP
address にしてしまった時点で、上記の例のよう
に「代表されるようなホスト名」が「特定のホス
ト名」に変換されてしまうので、IP address が
一つしかとれないのではないかと思います。

Ruby の場合、ホスト名に便利な使い方があった
りするので、修正は簡単ではないとは思いますが...

ちなみに socket.c の
tcp_s_gethostbyname(obj, host) 中にある

	h = gethostbyaddr((char *)&sin->sin_addr,
			  sizeof(sin->sin_addr),
			  sin->sin_family);

を

	h = gethostbyname(RSTRING(host)->ptr);

にすると、次のような結果になります。コードと
しては、複数の IP address に対応するようになっ
ているので、意図はこちらではないかなと思いま
す。

------------------------------
$ echo www.yahoo.com | ruby nslookup.rb 
["www.yahoo.akadns.net", ["www.yahoo.com"], 2, "216.115.102.78", "216.115.102.77", "216.115.105.2", "216.115.102.79", "216.115.102.80"]
216.115.102.78  www.yahoo.akadns.net
------------------------------

ということで、とりあえずおしらせしておきます。

In This Thread

Prev Next