use strict; use threads; use threads::shared; use IO::Socket; my $keep_running : shared = 1; my $sender_thread = threads->new(\&do_send); my $listener_thread = threads->new(\&do_listen); $sender_thread->detach(); $listener_thread->join(); sub do_listen { my $listener_sock = IO::Socket::INET->new(LocalHost => "127.0.0.1", LocalPort => 8080, Type => SOCK_STREAM, Proto => 'tcp', Listen => 1); my $client_sock; my $ClientNumber = 0; STDOUT->autoflush(1); print "Starting listener\n"; while ($keep_running) { my $client_sock = $listener_sock->accept(); my $reader_thread = threads->new(\&do_read, $client_sock, $ClientNumber); last unless defined($client_sock); $ClientNumber++; $reader_thread->detach(); print "Accepted a connection\n"; } print "Listener stopped\n"; } sub do_read { my $sock = shift; my $ClientNumber = shift; while (<$sock>) { print $ClientNumber . ":" . $_; } print "Client " . $ClientNumber . " disconnected\n"; } sub do_send { # any messages that the local user types while (my $line = ) { # TODO: you need to iterate through all active clients and send them # , not just one # $sock->print($line); # $sock->flush(); # patch for development sleep 1; } $keep_running = 0; }