use strict; use IO::Socket; use threads; use threads::shared; my $numClients = shift; my $all_created : shared = 0; $| = 1; threads->create(\&server); print "Creating $numClients clients...\n"; for (1..$numClients) { my $socket = IO::Socket::INET->new(Proto => "tcp", PeerAddr => "localhost", PeerPort => 7001) || print "Socket creation error: $!\n"; threads->new(\&client, $socket, $_)->detach; print "."; } print "\nAll Created\n"; sleep 1; $all_created = 1; ; sub server { my $server = new IO::Socket::INET(Proto => "tcp", LocalPort => 7001, Listen => 5) || die "failed to establish socket\n"; while (1) { my $client = $server->accept; threads->create(\&client_handle, $client); threads->yield; } } sub client_handle { my $client = shift; while (<$client>) { chomp; print $client $_ + 1, "\n"; threads->yield; } } sub client { my ($socket,$id) = @_; sleep 1 while (!$all_created); print $socket "1\n"; while (<$socket>) { chomp; print "$id <<== $_\n"; print $socket $_ + 1, "\n"; threads->yield; sleep 5; } return; }