gethostbyname

ホスト名から 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 を呼び出す場合には、注意が必要です。