SYNOPSIS use IO::Async::Loop; use Net::Async::EmptyPort; my $loop = IO::Async::Loop->new; my $ep = Net::Async::EmptyPort->new( loop => $loop, ); # could take a while to start... my $chosen_port = start_server_in_background(); $ep->wait_port({ port => $chosen_port })->get; DESCRIPTION This module is an asynchronous port of Net::EmptyPort. The interface is different and thus simplified from the original. A couple of the original methods are not implemented; specifically can_bind and check_port. They are not hard to implement but I don't have a good idea of why someone would use them. METHODS empty_port my $listen_future = $ep->empty_port({ host => '192.168.1.1', port => 8000, proto => 'tcp', }); This method has no required arguments but accepts the following named parameters: * host Defaults to 127.0.0.1 * port Defaults to 0; which means the kernel will immediately provide an open port. Alternately, if you provide a port Net::Async::EmptyPort will try that port up through to port 65000. * proto Defaults to tcp; the other option is udp. The return value is an IO::Async::Listener. The easiest way (though this will introduce a race condition) to make it work like the original is as follows: $ep->empty_port->then(sub { Future->done(shift->read_handle->sockport) }) Then the Future will simply contain the port, though a better option is to pass the actual listener or socket to whatever will use it if possible. wait_port my $socket_future = $ep->wait_port({ port => 8080, proto => 'tcp', host => '192.168.1.1', max_wait => 60, }); This method takes the following named parameters: * host Defaults to 127.0.0.1 * port Required. * proto Defaults to tcp; the other option is udp. * max_wait Defaults to 10 seconds. Set to -1 to wait indefinitely. The return value is a Future containing an IP::Socket::IP. You can use that for connecting, but unlike "empty_port" there is no race condition here so it makes perfect sense to just use wait_port as a "blocker." wait_port uses a basic exponential backoff to avoid quickly polling. Eventually the backoff method will be configurable.