IO::Lambda::Socket::TCPServerなるモジュールを作ってみた
これは要は、POCO::Server::TCPをIO::Lambdaベースで書き直してみた、というものです。
まだフィルタとか、全然できてませんが…
あ、今回初めてgithubも使ってみました。ソースコードはこちらにおいてあります。
GitHub - taiyoh/io-lambda-socket-tcpserver: IO: :TCPServer is a simplified TCP server
誤字、ドキュメント足りない、テスト書いてないなど、やることまだいっぱいあります><
とりあえず、ドキュメントは日本語でいいですか(;_;)
百聞は一見にしかず、ではないですが、これでechoサーバを書いてみるとこうなります。
#!/usr/bin/env perl use strict; use warnings; use utf8; use IO::Lambda qw/:all/; use IO::Lambda::Socket::TCPServer qw/:all/; my $server = lambda { context { Blocking => 0, LocalPort => 10000 }; server_start { context shift; client_accepted { my ( $client, $input ) = @_; $client->put( $input ); }}; }; $server->wait;
contextの使い方はわかったけど、lambdaの使い方とかはさっぱり><
あとはドキュメントを見てね、と言いたいところですが、全然書(いて|け)ません…
contextの使い方は、その後に実行する関数の本来の引数、と思ってもらえればいいです。
client_accepted関数の引数となってるブロックは、POCO::Server::TCPのClientInputに相当する部分です。
他のパラメータは、client_acceptedの前に実行されてるcontext関数の第2引数にハッシュリファレンスで入れてもらえれば、処理されます。が、今サポートしているのは、CientConnected、ClientDisconnected、ClientErrorの3つだけです。フィルターは後ほど実装予定。
肝心のPOCO::Server::TCPとの速度比較はこれからやってみます。結果がよければ、それだけで一つのアドバンテージになりそう。こっちの方が、見た目もシンプルだし(このキモい記法に慣れれば、の話ですが)。
(追記)
今更POE::Filter::*見てみましたが、これに合わせるとなると、かなり変えないとだなぁ…。ちょっとフィルター関係をどうすればいいか見直し必要かも。
というか、リクエストメッセージにCRLFが含まれていることが前提となるシステムだから、そこを何とか利用できればいいのか…。そういう意味で、POE的な汎用性は涙を飲んで切り捨てる必要があるな。じゃあ、このままでもいいといえばいいか。