Node.js で server の random port を取りたい時
server を使った test をしたい時、 その環境で使われていなさそうな port をあれこれ確かめたりしていた時代が僕にもありました。んで、それはさすがに無駄なので random port を取るためのモジュール を作っちゃったりしてたんですが、こんなことをしなくても server.listen(0)
にするだけでrandom port とれます。
const http = require('http');
const server = http.createServer((req, res) => {
res.end('hello');
});
server.listen(0);
server.on('listening', () => {
// ここで random port が取れる
const port = server.address().port;
});
なんでこんなことができるのか
listen(0) にすると、node.js では random port を勝手に取ってくれます。 OS の機能で使っていない port を取るわけです。便利。
このランダムな port は ephemeral port と呼ばれています。直訳すると短命port。
ephemeral port は wikipedia によるとそのレンジが決まっています。
IANAは、ポート番号49152から65535を"DYNAMIC AND/OR PRIVATE PORTS"(動的・私用ポート)として使うように提言している。
FreeBSDはバージョン4.6以降でIANAの提言する範囲を使っている。
多くのLinuxカーネルは32768から61000を使う。割り当て範囲は/proc/sys/net/ipv4/ip_local_port_rangeに書かれている。
Microsoft WindowsはWindows XPとWindows Server 2003まではデフォルト設定で1025から5000をエフェメラルポートとして使用していた。Windows VistaとWindows Server 2008以降はIANAの提言する範囲を使用している。
つまり IANA の定義では、 16383 程度のportはもてます。
ただそれ以上のportは割当できないので、注意は必要です。それ以上のportを割り当てたテストをしたい場合は上述したrandom portを割り当てるためのモジュール使うほうが良いかと。