ネットワーク名からネットワーク情報を取得する
getnetbyname は、システムのネットワークデータベース(Linux では主に
/etc/networks に登録されている情報)から、
NAME に指定されたネットワーク名に一致するネットワーク情報を取得します。
スカラーコンテキストなら、getnetbyname はネットワークアドレスを返します。
もし該当のネットワークが見つからなければ undef を返します。
ネットワークアドレスは、4 バイトの IP アドレスを数値として表現したものです。
正確に言うと、ネットワークバイトオーダー(ビッグエンディアン)の符号なし 32 ビット整数 (unsigned long) です。
そのため、pack と unpack
を使って文字列に変換します。
my $net = getnetbyname('link-local'); # ネットワーク名を取得
if ( defined $net ) {
# 数値表現の IP アドレスを文字列に変換
print join( '.', unpack( 'C4', pack( 'N', $net ) ) ); # 169.254.0.0
}
getnetbyaddr はリストコンテキストなら次のようにネットワーク情報をリストで返します。
# 0 1 2 3
my ( $name, $aliases, $addrtype, $net ) = getnetbyaddr( $naddr, AF_INET );
| No. | 変数 | 意味 | 実例 |
|---|---|---|---|
| 0 | $name |
ネットワーク名 | link-local |
| 1 | $aliases |
エイリアス (別名) | |
| 2 | $addrtype |
アドレスタイプ(アドレスファミリー)(2: IPv4, 10: IPv6) |
2 (IPv4) |
| 3 | $net |
ネットワークアドレス | 2851995648 (169.254.0.0) |
my ( $name, $aliases, $addrtype, $net ) = getnetbyname('link-local');
if ( defined $name ) {
my $addr = join( '.', unpack( 'C4', pack( 'N', $net ) ) ); # 数値表現の IP アドレスを文字列に変換
print $name, ' (', $addr, ")\n"; # link-local (169.254.0.0)
}