1

我有以下 Perl 代码将域名转换为 IP 地址。它在 IPv4 中运行良好。

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

但是,如果它是仅限 IPv6 的域名,例如“ipv6.google.com”,则它不起作用。

如何获取一行代码(首选 CORE 库)来获取 IPv6 IP 地址?

$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;
}

对于早期的 perls,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 回答