#! perl -slw use strict; use threads; use threads::shared; use IO::Socket::INET; my %db :shared; async { my $tid = threads->self->tid; warn "$tid: In-bound server running\n"; my $receiver = IO::Socket::INET->new( Proto => 'udp', LocalAddr => '127.0.0.1:12345', ReuseAddr => 1, ) or warn 'No $socket: ', $!; while( 1 ) { $receiver->recv( my $message, 4096, ); my $time = time; warn $tid, ' adding message ', $message, ' time ', $time; { lock %db; $db{ $time } = $message; } } warn "$tid: In-bound server stopping\n"; }->detach; my $sender = IO::Socket::INET->new( Proto => 'tcp', LocalAddr => '127.0.0.1:54321', Listen => 50, ReuseAddr => 1, ) or die 'No $socket: ', $!; my $running :shared = 0; while( 1 ) { warn 'TOL'; async { warn"before lock"; { lock $running; ++$running ; } warn"after lock"; my $tid = threads->self->tid; warn "$tid: Out-bound server running\n"; for( 1 .. 1000 ) { my $client = $sender->accept; warn "$tid: Out: Connection on $client\n"; lock %db; $client->send( "$tid\n" . join "\n", map{ "$_ -> $db{ $_ }" } keys %db ); } warn "$tid: Out-bound server ending\n"; { lock $running; --$running; } }->detach; warn "running: $running"; sleep 1 while $running > 19; warn 'looping'; }