Perl中的域名到IPv6地址

时间:2014-07-04 12:53:21

标签: perl sockets ip-address ipv6 gethostbyname

我有以下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 = ???

2 个答案:

答案 0 :(得分: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,CPAN上的Socket::GetAddrInfo可以使用相同的功能。

答案 1 :(得分:-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