in reply to Timeout problem using IO::Socket

You shouldn't need a timeout on the connect, but rather, on any reads (and possibly writes) to/from the socket. Here's an example of some code that I recently used that makes use of the alarm() handler.

It does not check the result of the signal handler, but suffices to know that the signal handler fired, and broke out of the eval(), which is waiting for a response on the open socket. (In this case of the code, all I need to know is that the remote host sent something (anything), to indicate it received the packet I sent it. It's not extremely robust code, but it served my purposes for playing a .WAV file to a remote Windows-running PC).
sub play_remote_file { my $file = shift; my $sock = new IO::Socket::INET (PeerAddr => 'jcwren', PeerPort => 10666, Proto => 'tcp', ); return unless $sock; print $sock $file, "\n"; $SIG{ALRM} = \&timed_out; eval { alarm (30); my $buf = <$sock>; alarm (0); }; close ($sock); } sub timed_out { die "GOT TIRED OF WAITING"; }
--Chris

e-mail jcwren

Replies are listed 'Best First'.
RE: (jcwren) Re: Timeout problem using IO::Socket
by ChOas (Curate) on Sep 27, 2000 at 15:51 UTC
    Yes, I see that, but what would happen if
    you called this code with a valid,unreachable
    IP address (e.g. 127.0.0.2) ?

    My problem is that my program hangs at the connect,
    and I want that forced out...
    I know IO::Socket::new times out pretty quickly when
    the remeote system's port I want to reach is closed,
    but I find it hanging when the system does not respond
    at all.

    GrtZ!,

      ChOas