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

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

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

有帮助吗?

解决方案

此主题 Perlmonks 建议您可以用Perl这样在Windows上创建套接字非阻塞:

ioctl($socket, 0x8004667e, 1);

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

其他提示

如果您不想使用低级别路线,则必须查看其他更具框架性的解决方案。

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

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

您可以查看[Coro],它使用协同程序实现了一个协作式多任务系统。这主要类似于线程,除了你获得用户空间线程,而不是系统线程。

您还没有说明您想要走多远,但您的选择是在 sysread 和框架之间,或者自己编写所述框架。最简单的方法就是使用线程或通过 Poe :: Wheel :: Run :: Win32 的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top