use IO::Socket; use IO::Select; use IO::Handle; $A_lsn = new IO::SOCKET::INET (LocalHost => 'localhost', LocalPort => 1234, Type => SOCK_STREAM, Proto => "tcp", Reuse => 1, Listen => 5) or die "A Server socket couldn't be created: $@\n"; $B_lsn = new IO::SOCKET::INET (LocalHost => 'localhost', LocalPort => 5555, Type => SOCK_STREAM, Proto => "tcp", Reuse => 1, Listen => 5) or die "B Server socket couldn't be created: $@\n"; my $sockets = new IO::Select(); $sockets->add($A); $sockets->add($B); while(@ready = $sockets->can_read) { foreach $sockets (@ready) { if ($sockets == $A_lsn) { #new A client (sends data) $A_sock = $A_lsn->accept() $sockets->add($A_sock); } elsif($sockets == $B_lsn) {#new B client (recv data) $B_sock = $B_lsn->accept(); $sockets->add($B_sock); } elsif($sockets == $A_sock) #A client sent data, forward to all B clients $buf = <$A_sock> my @writers = $sockets->can_write; foreach $writer (@writers) { if ($writer == $A_sock) { #ignore } else { print $writer $buf; } } }