使阻塞超时IO :: Socket读取

时间:2014-02-26 17:39:21

标签: perl sockets

我需要通过超时使阻塞套接字读取结束。我读了this个问题,我了解到IO :: Socket :: INET没有注意Timeout选项,并且使用eval / alarm了解了解决方案。但我正在使用Windows,alarm无法正常工作。还有其他解决方案吗?

1 个答案:

答案 0 :(得分:1)

在从套接字读取之前,使用具有所需超时的4-argument version of select来测试要读取的套接字上是否有任何数据可用。

另请参阅IO::Select模块,特别是IO::Select::can_read($timeout)方法,以测试套接字读取是否会阻塞。

示例:

$read_timeout = 5.0; # seconds
$socket = IO::Socket->new( ... );     # socket to read from

$selector = IO::Select->new;
$selector->add( $socket );

...

@ready = $selector->can_read( $read_timeout );
if (@ready > 0) {
    $socket->read( $buffer, 128 );   # copy 128 bytes into $buffer
} else {
    warn "data not available on socket now";
}