ホスト名から IP アドレスを取得する
gethostbyname
は、NAME に指定されたホスト名 (FQDN) から、
システムに対して IP アドレスを含んだホスト情報を要求します。
スカラーコンテキストなら、gethostbyname
は IP アドレスを表すバイナリーデータを返します。
もし IP アドレスが見つからなければ undef
を返します。
my $addr_bin = gethostbyname('www.futomi.com');
if ( defined $addr_bin ) {
my $addr = join( '.', unpack( 'C4', $addr_bin ) );
print $addr, "\n"; # 133.242.145.182
}
このアドレスを表すバイナリーデータは、
標準モジュール Socket
モジュールの
inet_ntoa
関数を使うこともできます。
use Socket;
my $addr_bin = gethostbyname('www.futomi.com');
if ( defined $addr_bin ) {
my $addr = inet_ntoa($addr_bin);
print $addr, "\n"; # 133.242.145.182
}
gethostbyaddr
はリストコンテキストなら次のようにホスト情報をリストで返します。
# 0 1 2 3 4
my ( $name, $aliases, $addrtype, $length, @addrs ) = gethostbyname('www.futomi.com');
No. | 変数 | 意味 | 実例 |
---|---|---|---|
0 | $name |
ホスト名 | www.futomi.com |
1 | $aliases |
エイリアス (別名) |
|
2 | $addrtype |
アドレスタイプ(アドレスファミリー)(Linux なら 2 : IPv4, 10 : IPv6) |
2 (IPv4) |
3 | $length |
アドレスのバイト長 | 4 |
4 | @addrs |
IP アドレスリスト | ("133.242.145.182") (各 IP アドレスはバイナリーデータ) |
@addrs
の IP アドレスリストの各 IP アドレスは、バイナリーデータで格納されます。
そのため、Socket モジュールの
inet_ntoa
関数を使って文字列に変換すると良いでしょう。
use Socket;
my ( $name, $aliases, $addrtype, $length, @addrs ) = gethostbyname('www.futomi.com');
print $name, ' (', join( ', ', map { inet_ntoa($_) } @addrs ), ")\n";
上記サンプルコードは次のような結果を出力します。
www.futomi.com (133.242.145.182)
gethostbyname
はシステムに対して IP アドレスを要求しますが、
システムは指定のホスト名に対する IP アドレスを知らなければ、
通常はシステムが参照している DNS に問い合わせ (DNS 正引き) をします。
そのため、応答に時間がかかる場合があります。
大量のホスト名から IP アドレスを取得する場合や、アクセス数が多いサイトで都度 gethostbyname
を呼び出す場合には、注意が必要です。