use strict; use IO::Socket::INET; use IO::Select; my $sock = IO::Socket::INET->new(LocalPort => 4455, Listen => 5); my $select = IO::Select->new($sock); my %gremlins; # list of gremlins! for(;;) { #mainloop if(my @socks = $select->can_read(0)) { #non-blocking check for data for my $gremlin (@socks) { if($gremlin eq $sock) { # connection my $c = $sock->accept(); next unless $c; my $init = <$c>; chomp $init; $gremlins{$c} = [$c,$init]; # can't store actual ref as key print "Added gremlin $init\n"; $select->add($c); # add to list of sockets } else { if($gremlin->eof()) { #child died! print "Gremlin $gremlins{$gremlin}[1] died\n"; $select->remove($gremlin); delete $gremlins{$gremlin}; next; } #message for you, sire! my $msg = <$gremlin>; chomp $msg; print "Got message '$msg', sending to gremlins\n"; for(keys %gremlins) { next if $_ eq $gremlin; #dont send the message to sender my $c = $gremlins{$_}[0]; #sock of peer print $c "$gremlins{$_}[1]: $msg\n"; #send to other gremlins everything we get, as an exercise } } } } sleep 1; }