http://www.perlmonks.org?node_id=1010966


in reply to Re^2: Timeout for timeout for an established connection
in thread Timeout for an established connection

my $index = $#noreply +1; push @noreply, $obj = HTTP_Request->new($ip, $packet, sub { delete $noreply[$index]; .............. }); .............. .............. my $check_time = time(); my $timeout = 30; while (1) { $poll->poll(5); for my $sock ( $poll->handles( POLLHUP | POLLERR | POLLNVAL )) { $sock->error(); } for my $sock ( $poll->handles(POLLIN) ) { $sock->recv(); } for my $sock ($poll->handles(POLLOUT)) { $sock->send(); } if (time > ($check_time + $timeout)) { $check_time = time; my $i; foreach (@noreply) { if ($_ && $_->ttl < $check_time) { delete $noreply[$i]; $_->close; } ++$i; } } }
Maybe someone has a more elegant solution?

Replies are listed 'Best First'.
Re^4: Timeout for timeout for an established connection
by zwon (Abbot) on Dec 31, 2012 at 10:01 UTC

    If you willing to switch to AnyEvent, then AnyEvent::Handle allows you to set inactivity timeouts for reading and writing just as you want.

    Also, calling delete on array values is deprecated. I'd suggest something like:

    @noreply = grep { $_ && $_->ttl >= $check_time } @noreply;