2013-06-28 3 views
0

일부 DNS 서버에서 내 도메인을 확인하려면 AnyEvent::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+ 리졸버를 작성할 수 있어야합니다 (프로그램의 다른 코드에서도 많은 핸들 또는 창 사용 중).

정말 많은 resolvers가 필요하다면 파일 설명자 제한을 늘려야합니다. 유닉스에서는 스크립트를 시작하기 전에 ulimit -n을 사용하면됩니다.

관련 문제