#!/usr/local/bin/perl -wT require 5.002; use strict; use IO::Socket; use IO::Select; # create a socket to listen to a port my $listen = IO::Socket::INET->new(Proto => 'tcp', LocalPort => 2323, Listen => 1, Reuse => 1) or die $!; # to start with, $select contains only the socket we're listening on my $select = IO::Select->new($listen); my @ready; # wait until there's something to do while(@ready = $select->can_read) { my $socket; # handle each socket that's ready for $socket (@ready) { # if the listening socket is ready, accept a new connection if($socket == $listen) { my $new = $listen->accept; $select->add($new); print $new->fileno . ": connected\n"; } else { # read a line of text. # close the connection if recv() fails. my $line=""; $socket->recv($line,80); if($line eq "") { print $socket->fileno . ": disconnected\n"; $select->remove($socket); $socket->close; }; my $socket; # broadcast to everyone. Close connections where send() fails. for $socket ($select->handles) { next if($socket==$listen); $socket->send($line) or do { print $socket->fileno . ": disconnected\n"; $select->remove($socket); $socket->close; }; } } } } 1;