Thanks Javafan. Using IO::Select is a good idea.
#!/usr/bin/perl -w
#
# udp client which sends a query, waits for timeout
# seconds and prints response if obtained else cribs.
#
use strict;
use IO::Socket;
use IO::Select;
my $srvhost = '10.1.1.111';
my $srvport = '3333';
my $client = new IO::Socket::INET(
PeerAddr => $srvhost,
PeerPort => $srvport,
Proto => 'udp');
my $sel = new IO::Select($client);
my @ready;
my $sock;
my $request = "e8aa9e somequery 123";
my $maxread = 1024;
while (1) {
if (! defined($client->send($request))) {
die "failed to send req\n";
}
print "sent $request\n\n";
@ready = $sel->can_read(5);
if (! scalar(@ready)) {
print "Response Timed out\n";
} else {
$sock = $ready[0];
if (! sysread($ready[0], $response, $maxread)) {
print "recv failed :$!\n";
} else {
print "got response $response\n";
}
}
sleep 3;
}
I don't need to do recv as I can read through sysread, and this being a server response I don't need to send back any replies - so I don't need recv for its capabilities of getting the remote host's information. I don't even need to be in blocking mode now - or do I?. Am I right in saying this?