AnyEvent::DNS
一部の DNS サーバーで自分のドメインを解決するために使用したいと考えています。サーバーリストは、それぞれ約 60 以上のサーバーの 2 つの場所から取得されます。1 つのサーバー リストに対してのみ解決を実行すると、問題はありません。しかし、すべてのリストに対して解決を実行すると、エラーが発生しました: "unable to create either an IPv4 or an IPv6 socket"
.
私のスクリプトは次のとおりです。
#!/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;
}
);
}