All pastes #281859 Raw Edit

Untitled

public text v1 · immutable
#281859 ·published 2006-12-17 03:13 UTC
rendered paste body
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};
            }
        }
    }
}