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ポートにメッセージおくるとかえってくる。