IPアドレスからホスト名への変換(gethostbyaddr)
「127.0.0.1」などのIPアドレスに対応するホスト名を知りたい場合があると思います。 また、TCPサーバでacceptを行った時などに相手のIPアドレスが32ビットの値として取得できますが、この32ビットの値に対応するホスト名を知りたい場合もあると思います。 ここでは、gethostbyaddrを利用してIPアドレスからホスト名を取得する方法を説明します。
gethostbyaddr
IPアドレスからホスト名への変換はgethostbyaddrを利用して行います。 gethostbyaddrはDNSに問い合わせてIPアドレスに対応するホスト名を調べる、逆引きを行ってくれます。 /etc/hosts(Linuxや*BSDなどのUNIX系OSの場合)や C:\windows\system32\drivers\etc\hosts (Windowsの場合)などにホスト名が登録してある場合にはそこから情報を取得することもあります。
#!/usr/bin/ruby
require "socket"
hostent = Socket.gethostbyname("www.yahoo.co.jp")
puts hostent[3].unpack("C4").join('.')
p Socket.gethostbyaddr(hostent[3])
gethostbyaddrは非常に簡単に利用できます。単純にIPアドレスを表す32ビットの変数を渡すだけです。
上記サンプルでは、「www.yahoo.co.jp」のIPアドレスを調べて、結果として返ってきた一つ目のIPアドレスをそのままgethostbyaddrに渡しています。 gethostbyaddrを試すだけならば、gethostbynameをやっている部分は不必要なのでご注意下さい。
gethostbyaddrはIPv4にしか対応していないため、3つ目の引数はAF_INETでなければなりません。 (IPv6ではgetnameinfoを使います。)