sub CheckServers { # go down the list of servers # and sent a packet to each # one to request info my $socket = IO::Socket::INET->new( Proto => 'udp', Type => SOCK_DGRAM); my $select = IO::Select->new($socket); my %responses; CHECK_SERVERS: while (@servers){ my $toread = $select; my $towrite = @servers ? $select : undef; my ($readref, $writeref) = IO::Select->select( $toread,$towrite,undef,$timeout ); last unless ($readref || $writeref); foreach my $sock ( @{ $writeref } ) { $sent++; my $server = shift @servers; my ($ip, $port) = split (/.:/, $server); next unless $port && $ip; my $paddr = sockaddr_in($port, inet_aton($ip)); my $ret = $sock->send($HOST_QUERY, 0, $paddr) || die "send: $!"; $waiting{$ip} = Time::HiRes::time; } foreach my $sock ( @{ $readref } ) { $rcvd++; my $rc = $sock->recv($reply, 10_000); next unless $rc; my ($port, $addr) = sockaddr_in($rc); my $ip = inet_ntoa($addr); if ( $reply ) { ... do stuff ... } next CHECK_SERVERS; } } }