#!/usr/bin/perl use strict; use warnings; use IO::Socket; use IO::Select; use Tie::RefHash; my ( %connections ); tie %connections, qw( Tie::RefHash ); # so we can use refs as hash keys my $server = IO::Socket::INET->new( Listen => SOMAXCONN, LocalPort => $opts{port}, Reuse => 1, Proto => 'tcp', ) or die "can't open connection: $!"; $server->blocking( 0 ); my $select = IO::Select->new( $server ); while('eternity'){ foreach my $con ( $select->can_read(1) ) { #another way is to let it block, instead of passing can_read a timeout, but I usually need to check state, maybe send new output, so I need to loop often if ( $con == $server ) { # looks like we have a new user connection $client->blocking( 0 ); $select->add( $client ); #whatever you want to store about the client can go in the value, I like using a hashref so I'm not limited $connections{$client}{ip} = $client->peerhost; } elsif ( exists $connections{$con} ) { # I guess it's a connected user sending us data ... } else { #whoops, unknown filehandlw } }