use strict;
use warnings;
use IO::Socket;


my $MAXLEN  = 1024;
my $PORTNO  = 5151;
my $TIMEOUT = 5;

my $server_host = shift;
my $msg         = "@ARGV";
my($port, $ipaddr, $hishost);

my $sock = IO::Socket::INET->new(Proto  => 'udp',
                              PeerPort  => $PORTNO,
                              PeerAddr  => $server_host)
           or die "Creating socket: $!\n";
           
$sock->send($msg) or die "send: $!";

eval 
  {
  local $SIG{ALRM} = sub { die "alarm time out" };
  alarm $TIMEOUT;
  $sock->recv($msg, $MAXLEN)      or die "recv: $!";
  alarm 0;
  1;  # return value from eval on normalcy
  } or die "recv from $server_host timed out after $TIMEOUT seconds.\n";

($port, $ipaddr) = sockaddr_in($sock->peername);
$hishost = gethostbyaddr($ipaddr, AF_INET);
print "Server $hishost responded: $msg\n";
