use strict; use warnings; use Errno qw( EADDRINUSE ); use Socket qw( PF_INET SOCK_STREAM INADDR_ANY sockaddr_in ); sub port_available { my $family = PF_INET; my $type = SOCK_STREAM; my $proto = getprotobyname('tcp') or die "getprotobyname: $!"; my $host = INADDR_ANY; # Use inet_aton for a specific interface my $port = '8888'; socket(my $sock, $family, $type, $proto) or die "socket: $!"; my $name = sockaddr_in($port, $host) or die "sockaddr_in: $!"; bind($sock, $name) and return 1; $! == EADDRINUSE and return 0; die "bind: $!"; } print port_available() ? "available\n" : "in use\n";