#!/usr/bin/perl $port=65000; $linelength=1000; require 5.002; use IO::Socket; use IO::Select; &initialize; while(@ready = $select->can_read) { for $socket (@ready) { if($socket == $listen) { &connection; } else { $socket->recv($line,$linelength); if($line eq "") { &disconnection; } else { &broadcast($line); } } } } sub initialize { $ARGV[0] ? $port=$ARGV[0] : $port=$port; $nullstring="\000"; $listen = IO::Socket::INET->new(Proto => "tcp", LocalPort => $port, Listen => 1, Reuse => 1) or die $!; $select = IO::Select->new($listen); } sub connection { $new = $listen->accept; $select->add($new); print $new->fileno . ": connected\n"; &numclients; } sub disconnection { print $socket->fileno . ": disconnected\n"; $select->remove($socket); $socket->close; &numclients; } sub numclients { $numofclients=$select->count()-1; $clientstext="$numofclients"; &broadcast($clientstext.$nullstring); } sub broadcast { for $eachsocket ($select->handles) { if ($eachsocket==$listen) { next; } else { $eachsocket->send($_[0]) or do { &disconnection; } } } } 1;