Index: Base.pm
===================================================================
--- Base.pm (revision 7602)
+++ Base.pm (working copy)
@@ -981,65 +981,75 @@
my $srcport = $self->{'srcport'};
- my (@res, $sockfamily, $dst_sockaddr);
- my $ns_address = ($self->nameservers())[0];
+ # my (@res, $sockfamily, $dst_sockaddr);
+ my @destinations;
+ my @nameservers = $self->nameservers();
my $dstport = $self->{'port'};
-
- # The logic below determines ther $dst_sockaddr.
- # If getaddrinfo is available that is used for both INET4 and INET6
- # If getaddrinfo is not avialable (Socket6 failed to load) we revert
- # to the 'classic mechanism
- if ($has_inet6 && ! $self->force_v4()){
-
- my ( $socktype_tmp, $proto_tmp, $canonname_tmp);
-
- no strict 'subs'; # Because of the eval statement in the BEGIN
- # AI_NUMERICHOST is not available at compile time.
-
- # The AI_NUMERICHOST surpresses lookups.
- my @res = getaddrinfo($ns_address, $dstport, AF_UNSPEC, SOCK_DGRAM,
- 0 , AI_NUMERICHOST);
-
- use strict 'subs';
-
- ($sockfamily, $socktype_tmp,
- $proto_tmp, $dst_sockaddr, $canonname_tmp) = @res;
-
- if (scalar(@res) < 5) {
- die ("can't resolve \"$ns_address\" to address (it could have been an IP address)");
- }
-
- }else{
- $sockfamily=AF_INET;
-
- if (! ip_is_ipv4($ns_address)){
- $self->errorstring("bgsend(ipv4 only):$ns_address does not seem to be a valid IPv4 address");
- return;
- }
-
- $dst_sockaddr = sockaddr_in($dstport, inet_aton($ns_address));
- }
+ foreach my $ns_address (@nameservers){
+ # The logic below determines ther $dst_sockaddr.
+ # If getaddrinfo is available that is used for both INET4 and INET6
+ # If getaddrinfo is not avialable (Socket6 failed to load) we revert
+ # to the 'classic mechanism
+ if ($has_inet6 && ! $self->force_v4()){
+
+ my ( $socktype_tmp, $proto_tmp, $canonname_tmp);
+
+ no strict 'subs'; # Because of the eval statement in the BEGIN
+ # AI_NUMERICHOST is not available at compile time.
+
+ # The AI_NUMERICHOST surpresses lookups.
+ my @res = getaddrinfo($ns_address, $dstport, AF_UNSPEC, SOCK_DGRAM,
+ 0 , AI_NUMERICHOST);
+
+ use strict 'subs';
+
+ my ($sockfamily, $socktype_tmp,
+ $proto_tmp, $dst_sockaddr, $canonname_tmp) = @res;
+
+ push @destinations, {'ns_address' => $ns_address,
+ 'sockfamily' => $sockfamily,
+ 'dst_sockaddr' => $dst_sockaddr};
+
+ if (scalar(@res) < 5) {
+ die ("can't resolve \"$ns_address\" to address (it could have been an IP address)");
+ }
+
+ }else{
+ my $sockfamily=AF_INET;
+
+ if (! ip_is_ipv4($ns_address)){
+ $self->errorstring("bgsend(ipv4 only):$ns_address does not seem to be a valid IPv4 address");
+ return;
+ }
+
+ push @destinations, {'dst_sockaddr' => scalar(sockaddr_in($dstport, inet_aton($ns_address))),
+ 'sockfamily' => $sockfamily,
+ 'ns_address' => $ns_address};
+ }
+ }
+
+
my @socket;
- if ($sockfamily == AF_INET) {
- $socket[$sockfamily] = IO::Socket::INET->new(
+ if ($destinations[0]{'sockfamily'} == AF_INET) {
+ $socket[$destinations[0]{'sockfamily'}] = IO::Socket::INET->new(
Proto => 'udp',
Type => SOCK_DGRAM,
LocalAddr => $srcaddr,
LocalPort => ($srcport || undef),
);
- } elsif ($has_inet6 && $sockfamily == AF_INET6() ) {
+ } elsif ($has_inet6 && $destinations[0]{'sockfamily'} == AF_INET6() ) {
# Otherwise the INET6 socket will just fail
my $srcaddr6 = $srcaddr eq "0.0.0.0" ? '::' : $srcaddr;
- $socket[$sockfamily] = IO::Socket::INET6->new(
+ $socket[$destinations[0]{'sockfamily'}] = IO::Socket::INET6->new(
Proto => 'udp',
Type => SOCK_DGRAM,
LocalAddr => $srcaddr6,
LocalPort => ($srcport || undef),
);
} else {
- die ref($self)." bgsend:Unsoported Socket Family: $sockfamily";
+ die ref($self)." bgsend:Unsoported Socket Family: $destinations[0]{'sockfamily'}";
}
unless (scalar(@socket)) {
@@ -1047,17 +1057,23 @@
return;
}
- print ";; bgsend($ns_address : $dstport)\n" if $self->{'debug'} ;
-
foreach my $socket (@socket){
next if !defined $socket;
- unless ($socket->send($packet_data,0,$dst_sockaddr)){
- my $err = $!;
- print ";; send ERROR($ns_address): $err\n" if $self->{'debug'};
-
- $self->errorstring("Send: ".$err);
- return;
+ foreach my $destination (@destinations){
+
+ my $ns_address = $destination->{'ns_address'};
+ print ";; bgsend($ns_address : $dstport)\n" if $self->{'debug'} ;
+
+ if(@socket[$destination->{'sockfamily'}] == $socket){
+ unless ($socket->send($packet_data,0,$destination->{'dst_sockaddr'})){
+ my $err = $!;
+ print ";; send ERROR($ns_address): $err\n" if $self->{'debug'};
+
+ $self->errorstring("Send: ".$err);
+ return;
+ }
+ }
}
return $socket;
}