use IO::Socket;
use IO::Select;
my $listener =
IO::Socket::INET->new( LocalPort => 8008, Listen => 5, Reuse => 1 );
die "Can't create socket for listening: $!" unless $listener;
print "Listening for connections on port 8008\n";
my $readable = IO::Select->new; # Create a new IO::Select object
$readable->add($listener); # Add the listener to it
my %names;
my $count;
while(1) {
# Get a list of sockets that are ready to talk to us.
my ($ready) = IO::Select->select($readable, undef, undef, undef);
foreach my $s (@$ready) {
# Is it a new connection?
if($s == $listener) {
# Accept the connection and add it to our readable list.
my $new_sock = $listener->accept;
$readable->add($new_sock) if $new_sock;
print $new_sock "Hello, Enter your name\r\n";
} else { # It's an established connection
my $buf = <$s>; # Try to read a line
# Was there anyone on the other end?
if( defined $buf ) {
#if they havent yet entered their name, the first thing they enter will be their name
if (!defined $names{$s}) {
chomp $buf;
#$buf =~ /^(.*)$/;
#print "$1\n";
$names{$s} = "$buf";
print "$names{$s}\n";
print $s "Name accepted\r\n";
$count = keys %names;
print $s "There are $count people connected\r\n";
@name = values %names;
print $s "@name\r\n";
} elsif ($buf =~ /goodbye/i) {
#if they think the server is not good enough for them they can leave
#and this is where they do it
print $s "See you later!\n";
#$names{$s} = undef;
delete $names{$s};
$readable->remove($s);
$s->close;
} else {
print $s "$names{$s}: There are $b people\r\n";
#print $s "You said: $buf\n";
}
} else { # The client disconnected.
$readable->remove($s);
$s->close;
print STDERR "Client Connection closed\n";
$count--;
delete $names{$s};
}
}
}
}