15
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Node.js で server の random port を取りたい時は listen(0) にする。

Posted at

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を割り当てるためのモジュール使うほうが良いかと。

15
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?