http://qs321.pair.com?node_id=727625

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

Esteemed Monks,

It seems that ActiveState's Win32 implementation of alarm will not terminate blocking system calls. Consider this brief example:

#!/usr/bin/perl use IO::Socket; $SIG{ALRM} = sub {print "Timeout\n"; die;}; my $server = shift; alarm 5; eval { my $fh = IO::Socket::INET->new($server); my $line = <$fh>; };

You can run this such as "test.pl smtp.myisp.com:25" to return your ISP's mail server ID. Under Linux, the alarm will break in after 5 seconds with no response. Under Win32, using alarm will not interrupt the process.

Every Perl networking book I have recommends this technique to handle timeouts, but you are stuck with a 20+ second wait under Windows.

Is there any other way to get control back faster? Perhaps a way to specify a timeout value associated with the read command?

Thanks for your advice.

UPDATE: Thank you for all the very quick and helpful answers. Yes, a lighter-weight solution is preferable. But if not possible, then any solution is better than none. This is part of a project replacing a Windows .exe with cross-platform code. So it needs to run on both Linux and the older Windows boxes. So far it has been very successful, until this snag.

There is a Timeout argument to new() when creating the socket, but apparently that only applies to connect() and accept().