#!/usr/bin/perl
use warnings;
use strict;
use IO::Socket;
use threads;
use threads::shared;
$|++;
print "$$ Server started\n";;  # do a "top -p -H $$" to monitor server

our @clients : shared;
@clients = ();

my $server = new IO::Socket::INET(
    Timeout   => 7200,
    Proto     => "tcp",
    LocalPort => 10000,
    Reuse     => 1,
    Listen    => 3
);
my $num_of_client = -1;

while (1) {
    my $client;

    do {
        $client = $server->accept;
    } until ( defined($client) );

    my $peerhost = $client->peerhost();
    print "accepted a client $client, $peerhost, id = ", ++$num_of_client, "\n";
    my $fileno = fileno $client;
    push (@clients, $fileno);
    #spawn  a thread here for each client
    my $thr = threads->new( \&processit, $client, $fileno, $peerhost )->detach();
}
# end of main thread

sub processit {
     my ($lclient,$lfileno,$lpeer) = @_; #local client
        
     if($lclient->connected){
          # Here you can do your stuff
          # I use have the server talk to the client
          # via print $client and while(<$lclient>)
          #print $lclient "$lpeer->Welcome to server\n";  
          
          while(<$lclient>){
             # print $lclient "$lpeer->$_\n";
              print "clients-> @clients\n";           
              
              foreach my $fn (@clients) { 
                  open my $fh, ">&=$fn" or warn $! and die;
                  print $fh  "$_"; 
		  print "Sending $_\n";
                  }
           
           }
        
    }
  
  #close filehandle before detached thread dies out
  close( $lclient);
  #remove multi-echo-clients from echo list
  @clients = grep {$_ !~ $lfileno} @clients;

}
__END__
