2

我正在编写一些通过 STDIN 与客户端进程对话的服务器代码。我正在尝试编写一段 perl 代码,以异步接收来自客户端 STDOUT 的响应。代码的阻塞版本可能如下所示:

sub _read_from_client
{
   my ($file_handle) = @_;
   while (my $line = <$file_handle>) {
      print STDOUT $line;
   }
   return;
}

重要的是,该片段需要在 Win32 平台上工作。*nix 平台有很多我不感兴趣的解决方案。我使用的是 ActivePerl 5.10。

4

2 回答 2

5

Perlmonks上的这个线程建议您可以通过这种方式在 Perl 中的 Windows 上创建一个非阻塞套接字:

ioctl($socket, 0x8004667e, 1);

该线程中的更多详细信息和资源

于 2008-09-26T20:29:29.853 回答
3

如果您不想走低级路线,则必须查看其他更框架化的解决方案。

您可以使用线程从输入中读取数据,并将其读取的所有数据填充到Thread::Queue中,然后在主线程中处理该线程。

您可以查看实现基于事件的框架的POE,尤其是POE::Wheel::Run::Win32。潜在地,您还可以从中窃取代码以自己实现非阻塞读取。

你可以看看 [Coro],它使用协程实现了一个协作多任务系统。这与线程最相似,只是您获得的是用户空间线程,而不是系统线程。

You haven't stated how far up you want to go, but your choice is between sysread and a framework, or writing said framework yourself. The easiest route to go is just to use threads or by going through the code of Poe::Wheel::Run::Win32.

于 2008-09-27T06:42:47.447 回答