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