2

我正在开发一个使用基于 epoll 的事件循环来处理多个同时套接字连接的程序。当应用程序检测到有数据要读取时,它会调用一个 process_request() 子程序,该子程序使用缓冲 IO。例如:

sub process_request {
    my ( $fh ) = @_;
    if ( my $line = <$fh> ) {
        # Do something interesting
    }
}

麻烦的是这里使用缓冲I/O,epoll不知道缓冲区中有未读数据在等待,所以它不会再次调用process_request()。

所以问题是,如何检测 Perl 的文件句柄中是否有未读数据,以便只要数据保留在缓冲区中,我就可以再次调用 process_request()?

4

1 回答 1

1

好吧,我知道您使用的是自己的事件循环,而不是 POE,但是您可能还是想借用 POE 的过滤器;它们可以在不使用 POE 的其余部分的情况下加载。初始化POE::Filter::Line每个套接字,当一个套接字变得可读时read,对其所有内容进行非阻塞,并将它们推入过滤器$filter->get。返回将是(0 或更多)行的数组引用,任何部分行都将存储在过滤器中,等待该行的其余部分。

如果那不吸引人,那么您总是可以自己重新实现相同的想法。这不是大量的工作,主要是每个套接字的字符串缓冲区和正则表达式匹配。

于 2009-11-18T19:12:59.753 回答