2

私は、epoll ベースのイベント ループを使用して複数の同時ソケット接続を処理するプログラムに取り組んでいます。アプリは、読み取るデータがあることを検出すると、バッファリングされた IO を使用する process_request() サブルーチンを呼び出します。例えば:

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 に答える