2014-07-04 4 views
1

도메인 이름을 IP 주소로 변환하려면 다음과 같은 Perl 코드가 있어야합니다. 그것은 IPv4에서 잘 작동합니다.도메인 이름에서 Perl로 된 IPv6 주소

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

그러나 "ipv6.google.com"과 같은 IPv6 전용 도메인 이름 인 경우 작동하지 않습니다.

IPv6 IP 주소를 얻기 위해 한 줄의 코드 (CORE 라이브러리 선호)를 얻으려면 어떻게해야합니까?

$host = "ipv6.google.com"; 
$ip_address = ??? 
+0

CPAN 모듈을 '사용'할 필요는 없지만 항상 소스 코드를 볼 수 있습니다. – toolic

+0

어떤 버전의 perl? – ysth

+0

Perl 5.10 이상을보고 있습니다 –

답변

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

을 펄, 같은 기능 CPAN의 Socket::GetAddrInfo에서 사용할 수 있습니다.

+0

소켓은 듀얼 존입니다. 소켓을 업그레이드하는 대신 Socket :: GetAddrInfo를 설치할 이유가 있습니까? – ikegami

+0

@ikegami : 어느 쪽이든 작동 할 것입니다. – ysth

+0

Perl 5.16 Windows를 사용하여 다음 오류가 발생합니다. ai_family는 a.pl 라인에서 지원되지 않습니다. –

-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 
+2

시스템의 이름 검색 인터페이스 ('getaddrinfo') 대신 DNS에 직접 액세스하면 호스트 파일 항목이 숨겨집니다. – ikegami

+0

어쨌든 Net :: DNS 사용을 피하려면? –

+0

Downvoting because : DNS 기능별 조회를 수행하는 것이 전체 기능이 아니라면 DNS에 직접적으로 관심을 가져서는 안됩니다. 99.9 %의 사례에서 프로그램은 그렇지 않습니다. 대신 그들은 단지 시스템 리졸버'getaddrinfo'를 사용하기를 원합니다. 다른 답변을 참조하십시오. – LeoNerd

관련 문제