NAME
Net::DNS::Native - non-blocking system DNS resolver
SYNOPSIS
use Net::DNS::Native;
use IO::Select;
use Socket;
my $dns = Net::DNS::Native->new();
my $sock = $dns->getaddrinfo("google.com");
my $sel = IO::Select->new($sock);
$sel->can_read(); # wait until resolving done
my ($err, @res) = $dns->get_result($sock);
die "Resolving failed: ", $err if ($err);
for my $r (@res) {
warn "google.com has ip ",
$r->{family} == AF_INET ?
inet_ntoa((unpack_sockaddr_in($r->{addr}))[1]) : # IPv4
Socket::inet_ntop(AF_INET6, (unpack_sockaddr_in6($r->{addr}))[1]); # IPv6
}
use Net::DNS::Native;
use AnyEvent;
use Socket;
my $dns = Net::DNS::Native->new;
my $cv = AnyEvent->condvar;
$cv->begin;
for my $host ('google.com', 'google.ru', 'google.cy') {
my $fh = $dns->inet_aton($host);
$cv->begin;
my $w; $w = AnyEvent->io(
fh => $fh,
poll => 'r',
cb => sub {
my $ip = $dns->get_result($fh);
warn $host, $ip ? " has ip " . inet_ntoa($ip) : " has no ip";
$cv->end;
undef $w;
}
)
}
$cv->end;
$cv->recv;
DESCRIPTION
This class provides several methods for host name resolution. It is designed to be used with event loops. All resolving are done by getaddrinfo(3) implemented in your system library. Since getaddrinfo() is blocking function and we don't want to block, call to this function will be done in separate thread. This class uses system native threads and not perl threads. So overhead shouldn't bee too big.
WARNING
To support threaded extensions like this one your perl should be linked with threads library. One of the possible solution is to build your perl with perl threads support using -Dusethreads
for Configure
script. But it is not necessary to build threaded perl. So, other solution is to not use -Dusethreads
and instead use -A prepend:libswanted="pthread "
. This will link your perl executable with libpthread.
If this conditions are not met you may get segfault. To check it run this oneliner:
perl -MConfig -le 'print $Config{usethreads}||$Config{libs}=~/-l?pthread\b/ ? "this perl may use threaded library" : "this perl may segfault with threaded library"'
METHODS
new
This is a class constructor. Accepts this optional parameters:
- pool => $size
-
If $size>0 will create thread pool with size=$size which will make resolving job. Otherwise will use default behavior: create and finish thread for each resolving request. If thread pool is not enough big to process all supplied requests, than this requests will be queued until one of the threads will become free to process next request from the queue.
- extra_thread => $bool
-
If pool option specified and $bool has true value will create temporary extra thread for each request that can't be handled by the pool (when all workers in the pool are busy) instead of pushing it to the queue. This temporary thread will be finished immediatly after it will process request.
getaddrinfo($host, $service, $hints)
This is the most powerfull method. May resolve host to both IPv4 and IPv6 addresses. For full documentation see getaddrinfo(). This method accepts same parameters but instead of result returns handle on which you need to wait for availability to read.
inet_pton($family, $host)
This method will resolve $host accordingly to $family, which may be AF_INET to resolve to IPv4 or AF_INET6 to resolve to IPv6. For full documentation see inet_pton(). This method accepts same parameters but instead of result returns handle on which you need to wait for availability to read.
inet_aton($host)
This method may be used only for resolving to IPv4. For full documentation see inet_aton(). This method accepts same parameters but instead of result returns handle on which you need to wait for availability to read.
gethostbyname($host)
This method may be used only for resolving to IPv4. For full documentation see gethostbyname(). This method accepts same parameters but instead of result returns handle on which you need to wait for availability to read.
get_result($handle)
After handle returned by methods above will became ready for read you should call this method with handle as argument. It will return results appropriate to the method which returned this handle. For getaddrinfo
this will be ($err, @res)
list. For inet_pton
and inet_aton
$packed_address
or undef
. For gethostbyname()
$packed_address
or undef
in scalar context and ($name,$aliases,$addrtype,$length,@addrs)
in list context.
NOTE: it is important to call get_result() on returned handle when it will become ready for read. Because this method destroys resources associated with this handle. Otherwise you will get memory leaks.
timedout($handle)
Mark resolving operation associated with this handle as timed out. This will not interrupt resolving operation (because there is no way to interrupt getaddrinfo(3) correctly), but will automatically discard any results returned when resolving will be done. So, after timedout($handle)
you can forget about $handle
and associated resolving operation. And don't need to call get_result($handle)
to destroy resources associated with this handle. Furthermore, if you are using thread pool and all threads in pool are busy and extra_thread
option not specified, but 1 resolving operation from this pool marked as timed out and you'll add one more resolving operation, this operation will not be queued. Instead of this 1 temporary extra thread will be created to process this operation. So you can think about timedout
like about real interrupter of long running resolving operation. But you are warned how it really works.
AUTHOR
Oleg G, <oleg@cpan.org>
COPYRIGHT AND LICENSE
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself