2012-04-11 84 views
1

我將兩個名稱服務器傳遞給Net::DNS::Resolver構造函數,但我只得到一個結果。來自多名域名服務器的DNS解析器結果

我應該如何更改代碼以接收來自所有名稱服務器的結果?

sub resolve_dns() 
{ 
    my $dns = $_[0]; 
    my $res = Net::DNS::Resolver->new(

       nameservers => [qw(24.116.197.232 114.130.11.67)], 
       recurse  => 0, 
       debug  => 1, 
       tcp_timeout => 3 
       ); 
    my $query = $res->search($dns); 

    if ($query) { 
     foreach my $rr ($query->answer) { 
      next unless $rr->type eq "A"; 
      print $rr->address, "\n"; 
     } 
    } else { 
     warn "query failed: ", $res->errorstring, "\n"; 
    } 
} 

回答

3

我假設DNS服務器在第一次出現之後出於備用的目的,並且只有單個回覆將被返回。

最好的辦法似乎是操縱Net::DNS::Resolver服務器列表並明確向每個服務器列表發出請求。

此示例代碼演示的原則

sub resolve_dns { 

    my $address = shift; 

    my $res = Net::DNS::Resolver->new 
    recurse  => 0, 
    debug  => 1, 
    tcp_timeout => 3, 
); 

    for my $ns (qw(24.116.197.232 114.130.11.67)) { 

    $res->nameservers($ns); 

    my $reply = $res->send($address); 

    if ($reply) { 
     my @type_a = grep $_->type eq 'A', $reply->answer; 
     print $_->address, "\n" for @type_a; 
    } 
    else { 
     warn sprintf "Query to %s failed: %s\n", $ns, $res->errorstring; 
    } 
    } 

} 
+0

每當我給'$水庫>域名服務器(NS $)'聲明,代碼是懸掛並沒有打印語句工作。當我評論這條線時,一切正常。 – cppcoder 2012-04-11 19:37:25

+0

如果您使用無效的DNS服務器地址,則代碼將掛起。檢查傳遞給'nameservers'方法的'$ ns'的值。還要注意,您必須爲地址傳遞一個空字符串,而不是像構造函數那樣傳遞一個匿名數組。他們是否有領先或尾隨的空白?這些地址不適合我,但我想他們是在一個專用網絡上。 – Borodin 2012-04-11 21:54:22