... # determine v4 or v6, nothing selected - then both if (!defined($opt{ipv4}) && !defined($opt{ipv6})) { $opt{ipv4} = $opt{ipv6} = 1 } ... # server (select between v4 and v6 if both exist) my $server = IO::Select->new(); # v4 server if ($opt{ipv4}) { my $server4 = IO::Socket::INET->new( Proto => 'tcp', LocalPort => $opt{port}, Listen => SOMAXCONN, Reuse => 1 ) or die "$0: Unable to create IPv4 server: $!\n"; $server->add($server4) } # v6 server if ($opt{ipv6}) { my $server6 = IO::Socket::INET6->new( Proto => 'tcp', LocalPort => $opt{port}, Listen => SOMAXCONN, Reuse => 1 ) or die "$0: Unable to create IPv6 server: $!\n"; $server->add($server6) } ... # determine which server has data while (my @servers = $server->can_read) { # loop servers for my $svr (@servers) { # read from v4 or v6 server that has data while(my $client = $svr->accept()) { #DO STUFF } } }