anshumangoyal has asked for the wisdom of the Perl Monks concerning the following question:

I am using the following code. I want to timeout and close the connection after 20 seconds, tried with alarms but nothing worked. Here is my code:
my $socket_resp = IO::Socket::INET->new(Blocking => 0, LocalPort => $c +omm_port, Proto => 'udp', Timeout => 2); $socket_resp->setsockopt(SO_RCVTIMEO, SO_RCVTIMEO, 10); print "Waiting for Response On Port $comm_port\n"; while (my $recieved_data = $socket_resp->getline()) { chomp($recieved_data); print "$recieved_data\n"; if ($recieved_data =~ m/^done/i) { last; } } $socket_resp->close();
alarms, and nothing else has worked. Can any one help.

Replies are listed 'Best First'.
Re: Not able to timeout
by zentara (Cardinal) on Jul 17, 2012 at 12:58 UTC
Re: Not able to timeout
by davido (Cardinal) on Jul 17, 2012 at 16:22 UTC

    I recently found success with Sys::SigAction, which facilitates alarm timeouts even in system calls that can prove to be stubborn at times.


    Dave

Re: Not able to timeout
by dolmen (Beadle) on Jul 18, 2012 at 14:40 UTC

    Once you begin to deal with I/O and timers, it's time to use a dedicated that will make your code more reliable, and easier to read and maintain.

    I strongly suggest AnyEvent.

    Try this (incompletely tested) code:

    use strict; use warnings; use AnyEvent; use AnyEvent::Handle::UDP; my $cv = AE::cv; my $comm_port = $ARGV[0] or die "missing port number"; my $server = AnyEvent::Handle::UDP->new( bind => [ localhost => $comm_port ], on_recv => sub { my ($datagram, $handle, $addr) = @_; if ($datagram =~ /^done/i) { $cv->send; } else { print $datagram; } }, rtimeout => 10, on_rtimeout => sub { warn "Timeout!\n"; $cv->send +} ); print "Waiting for Response On Port $comm_port\n"; $cv->recv;