2013-06-28 56 views
0

我想使用AnyEvent::DNS來解析我的域在一些DNS服務器上。 服務器列表來自兩個地方,每個約60多個服務器。 當我運行解決只有一個服務器列表,沒有問題。但如果我運行所有列表的解決方案,我得到一個錯誤:"unable to create either an IPv4 or an IPv6 socket"是否有AnyEvent :: DNS最大請求限制?

我的如下腳本:

#!/usr/bin/perl 
use Modern::Perl; 
use AnyEvent::DNS; 
use AnyEvent::Socket; 
use AnyEvent; 
use Module::Runtime qw/require_module/; 
use lib './lib'; 

my $domain = $ARGV[0] // 'fmn.xnimg.cn'; 
my $cv = AnyEvent->condvar; 

for my $mod (('DNS::xixik', 'DNS::yqie')) { # error 
#for my $mod (('DNS::xixik')) { # ok 
    require_module($mod); 
    my $dnslist = $mod->new->get_dnslist; 
    for my $isp (keys %$dnslist) { 
     while (my ($addr, $dns) = each %{ $dnslist->{$isp} }) { 
      resolv($isp . $addr, $_, $domain) for @{$dns}; 
     } 
    } 
} 
$cv->recv; 

sub resolv { 
    my ($addr, $dns, $domain) = @_; 
    my $resolver = AnyEvent::DNS->new(
     server => [ AnyEvent::Socket::parse_address $dns ], 
    ); 
    $cv->begin; 
    $resolver->resolve(
     "$domain" => 'a', 
     sub { 
      my @ips = map { $_->[-1] } @_; 
      printf "%s (%s) => %s\n", $dns, $addr, join(", ", @ips) if @ips; 
      $cv->end; 
     } 
    ); 
} 

回答

1

AnyEvent :: DNS有沒有人爲的限制,但平行優秀查詢的數量是有限的max_outstanding配置值(超過此限制的只是延緩請求,它不導致錯誤)。然而,你爲每個請求創建了一個解析器 - 每個解析器需要一個或多個套接字,這可能是你看到的問題(通常你應該可以創建500個以上的解析器,除非你的程序中的其他代碼也創建了很多手柄,或者你正在使用Windows)。

如果你真的需要這麼多的解析器,你需要增加文件描述符限制 - 在unix上,你可以在啓動腳本之前用ulimit -n來完成。