采用一個主線程負責接收來自用戶端的連接配接請求,對于每一個用戶端的請求,由以一個線程進行處理。這樣客戶的連接配接于客戶的事務處理分别在不同的線程,主線程建立完成事務處理線程之後,将不再對其進行任何控制。事務處理線程負責來自用戶端的請求,将接收到的内容顯示到STDOUT。因為每一個客戶的請求都會導緻一個事務線程的建立與銷毀,是以在效率上會有所影響。
#!/usr/bin/perl
use 5.006;
use strict;
use warnings;
use threads;
use IO::Socket;
my $host = "localhost";
my $port = 27002;
my $quit = 0;
$SIG{INT} = sub{$quit++};
my $sock = IO::Socket::INET->new(Listen => 20,
LocalPort => $port,
Timeout => 60*60,
Reuse => 1
)
or die "can not create listen sock:$@";
warn "waiting for incoming connections on port $port/n";
while(!$quit){
next unless my $session = $sock->accept;
my $t = threads->create(/&proccess_connection,$session);
$t->detach;
}
close $sock;
#thread subroutine,it print parameters
sub proccess_connection{
my $s = shift;
print "process_connection start/n";
my $peer = gethostbyaddr($s->peeraddr,AF_INET || $s->peerhost);
my $port = $s->peerport;
warn "connection from [$host,$port]/n";
while(<$s>){
chomp;
print $_,"/n";
}
$s->close;
print "process_connection end/n";
}