# -*- perl -*- # Picks a random TCP port and attempts to bind it, retrying a few # times if the chosen port is in use. This is better than just # picking a random number without checking whether it is in use (but # of course a race window still exists). # # On success, prints a port number on stdout and exits with status 0. # On failure, prints an error on stderr and exits with a nonzero status. use warnings; use strict; use Socket; socket(SOCK, PF_INET, SOCK_STREAM, 0) || die "socket: $!\n"; for (my ($i) = 0; ; $i++) { my ($port) = int(rand(16383)) + 49152; if (bind(SOCK, sockaddr_in($port, INADDR_ANY))) { print "$port\n"; exit 0; } elsif ($i < 10 && $!{EADDRINUSE}) { # Address already in use. Try again. } else { die "bind: $!\n"; } }