0

I want to use AnyEvent::DNS to resolve my domain on some DNS servers. The server list are got from two place, each about 60+ servers. When I run resolve for only one server list,no problem. But if I run resolve for all list, I got an error: "unable to create either an IPv4 or an IPv6 socket".

My script as follow:

#!/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;
        }
    );
}
chenryn
  • 121
  • 5

1 Answers1

1

AnyEvent::DNS has no artificial limits, but the number of parallel outstanding queries is limited to the max_outstanding configuration value (exceeding this limit simply delays requests, it does not cause errors). However, you create a resolver for every request - each resolver needs one or more sockets, which is likely the problem you are seeing (normally you should be able to create 500+ resolvers though, unless other code in your program also creates a lot of handles, or you are using windows).

If you really need so many resolvers you need to increase the file descriptor limit - on unix, you can do that with ulimit -n before starting your script.

Remember Monica
  • 3,897
  • 1
  • 24
  • 31