如何使用IO :: Select阻止等待读取或写入套接字?

时间:2017-02-10 04:32:35

标签: perl sockets networking

我正在使用IO::Select

它是normal select call的OOP包装器,但它公开了can_read()can_write()方法。有没有办法阻止等待读取或写入套接字?这是否(几乎)没有首先击败IO :: Select的目的?

2 个答案:

答案 0 :(得分:3)

使用IO::Select->select

  

选择(READ,WRITE,EXCEPTION [,TIMEOUT])

     

select是一种静态方法,您可以使用包名new来调用它。 READWRITEEXCEPTIONundefIO::Select个对象。 TIMEOUT是可选的,与核心选择调用具有相同的效果。

     

结果将是一个包含3个元素的数组,每个元素都引用一个数组,该数组将保存准备好分别读取,写入和异常的句柄。出错时会返回一个空列表。

例如:

my $rsel  = IO::Select->new($rfh);
my $wsel  = IO::Select->new($wfh);
my $esel  = IO::Select->new($rfh, $wfh);

my @ready = IO::Select->select($rsel, $wsel, $esel, undef);

答案 1 :(得分:2)

  

如果没有给出TIMEOUT并且注册了任何句柄,则呼叫将被阻止。

如果您没有通过超时,看起来can_readcan_write 阻止。我建议这很少是期望的,尽管可能在某些情况下。

就个人而言,我建议使用众多事件模块之一(POE,AnyEvent等)。要做得更多,但要更清洁地处理更多场景。