2

STDIN経由でクライアントプロセスと通信するサーバーコードを書いています。クライアントの STDOUT から非同期的に応答を受信する perl コードのスニペットを作成しようとしています。ブロッキング バージョンのコードは次のようになります。

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::Wheel::Run::Win32を実装するPOEを見ることができます。潜在的に、そこからコードを盗んで、ノンブロッキング読み取りを自分で実装することもできます。

コルーチンを使用して協調的なマルチタスク システムを実装する [Coro] を見ることができます。これは、システム スレッドではなくユーザー空間スレッドを取得することを除いて、スレッドとほとんど同じです。

あなたはどこまで行きたいかを述べていませんが、あなたの選択はsysreadフレームワークか、フレームワークを自分で書くかです。最も簡単な方法は、スレッドを使用するか、 のコードを実行することですPoe::Wheel::Run::Win32

于 2008-09-27T06:42:47.447 に答える