首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有AnyEvent::DNS最大请求限制?

是否有AnyEvent::DNS最大请求限制?
EN

Stack Overflow用户
提问于 2013-06-28 20:26:49
回答 1查看 335关注 0票数 0

我想使用AnyEvent::DNS在一些DNS服务器上解析我的域。服务器列表从两个地方获得,每个位置都是关于60+服务器的。当我只对一个服务器列表运行resolve时,没有问题。但是如果我对所有列表运行resolve,我会得到一个错误:"unable to create either an IPv4 or an IPv6 socket"

我的脚本如下:

代码语言:javascript
复制
#!/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;
        }
    );
}
EN

回答 1

Stack Overflow用户

发布于 2013-12-29 08:16:18

DNS没有人为的限制,但是并行未完成查询的数量被限制到max_outstanding配置值(超过这个限制只会延迟请求,不会导致错误)。但是,您需要为每个请求创建一个解析器-每个解析器都需要一个或多个套接字,这很可能就是您所看到的问题(通常您应该能够创建500+解析器,除非您的程序中的其他代码也创建了许多句柄,或者您正在使用windows)。

如果你真的需要这么多解析器,你需要增加文件描述符的限制-在unix上,你可以在启动脚本之前使用ulimit -n来做这件事。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17364739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档