#! perl -sw use strict; use threads; use threads::shared; use IO::Socket; use Digest::MD5 qw[ md5_hex ]; use List::Util qw[ shuffle ]; use constant CRLF => chr( 13 ) . chr( 10 ); $/ = $\ = CRLF; my %files :shared = map{ open my $fh, '<:raw', $_ or warn "$_: $!"; $_ => md5_hex( do{ local $/; <$fh> } ); } (shuffle glob '*.pl' )[ 0 .. 9 ]; my $server = IO::Socket::INET->new( LocalHost => 'localhost', LocalPort => 1234, Listen => SOMAXCONN, Reuse =>1, ) or die "Couldn't create listening socket"; while( 1 ) { my $client = $server->accept; async { my $peerhost = $client->peerhost .':'. $client->peerport; print $client join ' ', %files; my $reply = <$client>; print $client 'DONE'; warn "$peerhost : $reply\n"; }->detach; } close $server; __END__ c:\test>850473-s.pl 127.0.0.1:59137 : PASSED 127.0.0.1:59138 : PASSED 127.0.0.1:59139 : PASSED 127.0.0.1:59140 : PASSED 127.0.0.1:59141 : PASSED 127.0.0.1:59142 : PASSED 127.0.0.1:59143 : PASSED 127.0.0.1:59144 : PASSED 127.0.0.1:59145 : PASSED 127.0.0.1:59146 : PASSED 127.0.0.1:59147 : PASSED 127.0.0.1:59148 : PASSED 127.0.0.1:59149 : PASSED 127.0.0.1:59150 : PASSED 127.0.0.1:59151 : PASSED