TCPサーバのテスト用に、空きポートを見つける方法

Perl でサーバをテストするためのモジュール Test::TCP の作者 id:tokuhirom が言ってたことだけど、テスト用に空きポートを見つけるのは、bind の port 番号に 0 を渡すのが一番簡単。Perl で書くなら、こんな感じ。

my $unused_port = do {
    my $l = IO::Socket::INET->new(
        Listen    => 5,
        LocalHost => '127.0.0.1',
        LocalPort => 0,
        Proto     => 'tcp',
        ReuseAddr => 1,
    ) or die $!;
    $l->sockport;
};

これで確保されるのは emphemeral port なので、取得したポート番号を再び使おうとする間に他のプログラムが (outgoing TCP connection のために) 使っちゃう可能性は論理的にはあるんだけど、多くの OS では単調増加で番号をふってくだろうから、たぶん大丈夫 *1OSX でしか試してないけど。

*1:OpenBSD はランダムでしたっけ