perl利用してマルチスレッドしながらポート監視
意味があるかは別にして実験。
スレッドにして
メインの処理をさせながら
サブでポートを監視し
特定のメッセージの場合、応答する。
ファイヤーウォール内の想定なので
ポートをたたくのに認証等は考えない。
perlは5.12.3
参考にさせていただいたサイトは以下。
echo サーバを作ってみよう (2)
ソケットによる通信を行う - Perl入門ゼミ
Perlでマルチスレッド
あんまりperlわかってないですし
すごく即興なので
多々いけてないところあるかもしれませんが、ご容赦を。
use strict; use warnings; use Socket; use threads; use Thread::Queue; $| = 1; my $queue = new Thread::Queue; my $mainTask = threads->new(\&echoA); my $subTask = threads->new(\&listenPorter); $mainTask->join; $subTask->join; print "\n"; print "done.\n"; sub echoA { while(1) { print "A\n"; sleep(2); } } sub listenPorter { socket(CLIENT_WAITING, PF_INET, SOCK_STREAM, 0) or die "Cannot create socket: $!"; setsockopt(CLIENT_WAITING, SOL_SOCKET, SO_REUSEADDR, 1) or die "Cannot set socket: $!"; my $local_port = 9000; my $pack_addr = sockaddr_in( $local_port, INADDR_ANY ); bind( CLIENT_WAITING, $pack_addr ) or die "Cannot bind: $!"; listen( CLIENT_WAITING, SOMAXCONN ) or die "Cannot listen: $!"; while( accept( CLIENT, CLIENT_WAITING ) ){ select(CLIENT); $|=1; select(STDOUT); my $content; while( my $line = <CLIENT> ){ chomp($line); if ( $line =~ /ruok/ ) { print CLIENT 'imok' . "\n"; } } close(CLIENT); } }
プログラムを実行させながら、telnetで9000ポートにメッセージおくるとかえってくる。