1

ドメイン名を IP アドレスに変換する次の Perl コードがあります。IPv4 では正常に動作します。

$host = "example.com";
$ip_address = join('.', unpack('C4',(gethostbyname($host))[4]));

ただし、「ipv6.google.com」などのIPv6専用ドメイン名の場合は動作しません。

IPv6 IP アドレスを取得するための 1 行のコード (CORE ライブラリを優先) を取得するにはどうすればよいですか?

$host = "ipv6.google.com";
$ip_address = ???
4

2 に答える 2

3

5.14 以降では、コアを使用できますSocket

use 5.014;
use warnings;
use Socket ();

# protocol and family are optional and restrict the addresses returned
my ( $err, @addrs ) = Socket::getaddrinfo( $ARGV[0], 0, { 'protocol' => Socket::IPPROTO_TCP, 'family' => Socket::AF_INET6 } );
die $err if $err;

for my $addr (@addrs) {
    my ( $err, $host ) = Socket::getnameinfo( $addr->{addr}, Socket::NI_NUMERICHOST );
    if ($err) { warn $err; next }
    say $host;
}

以前の perl では、同じ機能がSocket::GetAddrInfoCPAN から利用できます。

于 2014-07-04T13:57:18.903 に答える
-1

Net::DNSまた、あなたを助けることができます:

#!/usr/bin/perl -w                                                                                                  
use strict;
use warnings;

use Net::DNS;

my $res   = Net::DNS::Resolver->new;
my $query = $res->query("ipv6.google.com", "AAAA")
    or die "query failed: ", $res->errorstring;

foreach my $rr (grep { $_->type eq 'AAAA' } $query->answer) {
    print $rr->address, "\n";
}

出力:

2607:f8b0:4010:801:0:0:0:1005
于 2014-07-04T13:19:10.967 に答える