POE::Component::Client::DNS

Examples of resolving a "large" number of domains in parallel using asynchronous DNS calls.

Version 3 API
#!/usr/bin/env perl
use strict;
use warnings;
use POE;
use POE::Component::Client::DNS;
my @ips = qw( 127.0.0.1 10.0.0.1 192.168.0.1 192.168.1.1 1.2.3.4
8.8.4.4 8.8.8.8 208.67.220.220 208.67.222.222 );
my $resolver = POE::Component::Client::DNS->spawn(
Alias => 'resolver',
Timeout => 10,
);
POE::Session->create(
inline_states => {
_start => sub { $_[KERNEL]->yield('lookup') for 1..5; },
lookup => sub {
my $ip = shift @ips;
return unless defined $ip;
# Example of using POE::Component::Client::DNS Version 3 API
my $response = $resolver->resolve(
event => 'response',
host => $ip,
type => 'PTR',
context => { },
);
$_[KERNEL]->yield(response => $response) if $response;
},
response => sub {
my $request_address = $_[ARG0]->{'host'};
my $net_dns_packet = $_[ARG0]->{'response'};
my $net_dns_errorstring = $_[ARG0]->{'error'};
unless ( defined $net_dns_packet ) {
print "$request_address: error ($net_dns_errorstring)\n";
$_[KERNEL]->yield('lookup');
return;
}
my @net_dns_answers = $net_dns_packet->answer();
unless ( scalar @net_dns_answers ) {
print "$request_address: no answer\n";
$_[KERNEL]->yield('lookup');
return;
}
foreach ( @net_dns_answers ) {
if ( $_->type eq "PTR" ) {
( my $fqdn = $_->rdatastr ) =~ s/\.$//;
print "$request_address: $fqdn\n";
last;
}
}
$_[KERNEL]->yield('lookup');
},
}
);
$poe_kernel->run();
exit 0;
view raw dns-3.pl hosted with ❤ by GitHub

Version 2 API
#!/usr/bin/env perl
use strict;
use warnings;
use POE;
use POE::Component::Client::DNS;
my @ips = qw( 127.0.0.1 10.0.0.1 192.168.0.1 192.168.1.1 1.2.3.4
8.8.4.4 8.8.8.8 208.67.220.220 208.67.222.222 );
my $resolver = POE::Component::Client::DNS->spawn(
Alias => 'resolver',
Timeout => 10,
);
POE::Session->create(
inline_states => {
_start => sub { $_[KERNEL]->yield('lookup') for 1..5; },
lookup => sub {
my $ip = shift @ips;
return unless defined $ip;
# Example of using POE::Component::Client::DNS Version 2 API
$_[KERNEL]->post( 'resolver',
'resolve',
'response',
$ip, 'PTR', 'IN' );
},
response => sub {
my $request_address = $_[ARG0]->[0];
my ( $net_dns_packet, $net_dns_errorstring ) = @{ $_[ARG1] };
unless ( defined $net_dns_packet ) {
print "$request_address: error ($net_dns_errorstring)\n";
$_[KERNEL]->yield('lookup');
return;
}
my @net_dns_answers = $net_dns_packet->answer();
unless ( scalar @net_dns_answers ) {
print "$request_address: no answer\n";
$_[KERNEL]->yield('lookup');
return;
}
foreach ( @net_dns_answers ) {
if ( $_->type eq 'PTR' ) {
( my $fqdn = $_->rdatastr ) =~ s/\.$//;
print "$request_address: $fqdn\n";
last;
}
}
$_[KERNEL]->yield('lookup');
},
}
);
$poe_kernel->run();
exit 0;
view raw dns-2.pl hosted with ❤ by GitHub

No comments:

Post a Comment