Perl 是否有AnyEvent::DNS最大请求限制?
我想使用Perl 是否有AnyEvent::DNS最大请求限制?,perl,perl-module,anyevent,Perl,Perl Module,Anyevent,我想使用AnyEvent::DNS在某些DNS服务器上解析我的域。 服务器列表来自两个地方,每个地方大约有60多台服务器。 当我只为一个服务器列表运行resolve时,没有问题。但是,如果我运行“全部解析”列表,我会得到一个错误:“无法创建IPv4或IPv6套接字” 我的脚本如下: #!/usr/bin/perl use Modern::Perl; use AnyEvent::DNS; use AnyEvent::Socket; use AnyEvent; use Module::Runtime
AnyEvent::DNS
在某些DNS服务器上解析我的域。
服务器列表来自两个地方,每个地方大约有60多台服务器。
当我只为一个服务器列表运行resolve时,没有问题。但是,如果我运行“全部解析”列表,我会得到一个错误:“无法创建IPv4或IPv6套接字”
我的脚本如下:
#!/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;
}
);
}
DNS没有人为限制,但并行未完成查询的数量限制为最大未完成配置值(超过此限制只会延迟请求,不会导致错误)。但是,您为每个请求创建一个冲突解决程序-每个冲突解决程序都需要一个或多个套接字,这可能就是您看到的问题(通常您应该能够创建500多个冲突解决程序,除非程序中的其他代码也创建了许多句柄,或者您正在使用windows) 如果您真的需要这么多解析器,您需要增加unix上的文件描述符限制,那么可以在启动脚本之前使用ulimit-n