UDP/データグラムソケット#

安定性: 2 - Stable

ソースコード: lib/dgram.js

node:dgram モジュールは、UDPデータグラムソケットの実装を提供します。

import dgram from 'node:dgram';

const server = dgram.createSocket('udp4');

server.on('error', (err) => {
  console.error(`server error:\n${err.stack}`);
  server.close();
});

server.on('message', (msg, rinfo) => {
  console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

server.on('listening', () => {
  const address = server.address();
  console.log(`server listening ${address.address}:${address.port}`);
});

server.bind(41234);
// Prints: server listening 0.0.0.0:41234const dgram = require('node:dgram');
const server = dgram.createSocket('udp4');

server.on('error', (err) => {
  console.error(`server error:\n${err.stack}`);
  server.close();
});

server.on('message', (msg, rinfo) => {
  console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

server.on('listening', () => {
  const address = server.address();
  console.log(`server listening ${address.address}:${address.port}`);
});

server.bind(41234);
// Prints: server listening 0.0.0.0:41234

クラス: dgram.Socket#

データグラムの機能をカプセル化します。

dgram.Socket の新しいインスタンスは dgram.createSocket() を使用して作成されます。new キーワードを dgram.Socket インスタンスの作成に使用してはいけません。

イベント: 'close'#

'close' イベントは、ソケットが close() で閉じられた後に発生します。一度トリガーされると、このソケットで新しい 'message' イベントは発生しません。

イベント: 'connect'#

'connect' イベントは、connect() の呼び出しが成功した結果、ソケットがリモートアドレスに関連付けられた後に発生します。

イベント: 'error'#

'error' イベントは、何らかのエラーが発生したときに常に発生します。イベントハンドラ関数には、単一の Error オブジェクトが渡されます。

イベント: 'listening'#

'listening' イベントは、dgram.Socket がアドレス指定可能になり、データを受信できるようになった時点で発生します。これは、socket.bind() を明示的に使用するか、socket.send() を使用してデータが初めて送信されるときに暗黙的に発生します。dgram.Socket がリッスンするまで、基盤となるシステムリソースは存在せず、socket.address()socket.setTTL() などの呼び出しは失敗します。

イベント: 'message'#

'message' イベントは、ソケットで新しいデータグラムが利用可能になったときに発生します。イベントハンドラ関数には、msgrinfo の2つの引数が渡されます。

  • msg <Buffer> メッセージです。
  • rinfo <Object> リモートアドレス情報です。
    • address <string> 送信者のアドレスです。
    • family <string> アドレスファミリー ('IPv4' または 'IPv6') です。
    • port <number> 送信者のポートです。
    • size <number> メッセージのサイズです。

受信パケットのソースアドレスがIPv6リンクローカルアドレスの場合、インターフェース名が address に追加されます。たとえば、en0 インターフェースで受信したパケットの address フィールドは 'fe80::2618:1234:ab11:3b9c%en0' のようになります。ここで '%en0' はゾーンIDの接尾辞としてのインターフェース名です。

socket.addMembership(multicastAddress[, multicastInterface])#

カーネルに対し、IP_ADD_MEMBERSHIP ソケットオプションを使用して、指定された multicastAddressmulticastInterface でマルチキャストグループに参加するよう指示します。multicastInterface 引数が指定されていない場合、オペレーティングシステムはいずれかのインターフェースを選択し、そこへのメンバーシップを追加します。利用可能なすべてのインターフェースにメンバーシップを追加するには、インターフェースごとに addMembership を複数回呼び出します。

バインドされていないソケットで呼び出された場合、このメソッドは暗黙的にランダムなポートにバインドし、すべてのインターフェースでリッスンします。

複数の cluster ワーカーでUDPソケットを共有する場合、socket.addMembership() 関数は一度だけ呼び出す必要があります。そうしないと EADDRINUSE エラーが発生します。

import cluster from 'node:cluster';
import dgram from 'node:dgram';

if (cluster.isPrimary) {
  cluster.fork(); // Works ok.
  cluster.fork(); // Fails with EADDRINUSE.
} else {
  const s = dgram.createSocket('udp4');
  s.bind(1234, () => {
    s.addMembership('224.0.0.114');
  });
}const cluster = require('node:cluster');
const dgram = require('node:dgram');

if (cluster.isPrimary) {
  cluster.fork(); // Works ok.
  cluster.fork(); // Fails with EADDRINUSE.
} else {
  const s = dgram.createSocket('udp4');
  s.bind(1234, () => {
    s.addMembership('224.0.0.114');
  });
}

socket.addSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])#

カーネルに対し、IP_ADD_SOURCE_MEMBERSHIP ソケットオプションを使用して、指定された sourceAddressgroupAddress で、multicastInterface を使用してソース固有のマルチキャストチャネルに参加するよう指示します。multicastInterface 引数が指定されていない場合、オペレーティングシステムはいずれかのインターフェースを選択し、そこへのメンバーシップを追加します。利用可能なすべてのインターフェースにメンバーシップを追加するには、インターフェースごとに socket.addSourceSpecificMembership() を複数回呼び出します。

バインドされていないソケットで呼び出された場合、このメソッドは暗黙的にランダムなポートにバインドし、すべてのインターフェースでリッスンします。

socket.address()#

ソケットのアドレス情報を含むオブジェクトを返します。UDPソケットの場合、このオブジェクトには addressfamilyport プロパティが含まれます。

このメソッドは、バインドされていないソケットで呼び出されると EBADF をスローします。

socket.bind([port][, address][, callback])#

  • port <integer>
  • address <string>
  • callback <Function> パラメーターなし。バインドが完了したときに呼び出されます。

UDPソケットの場合、dgram.Socket が指定された port とオプションの address でデータグラムメッセージをリッスンするようにします。port が指定されていないか 0 の場合、オペレーティングシステムはランダムなポートにバインドしようとします。address が指定されていない場合、オペレーティングシステムはすべてのアドレスでリッスンしようとします。バインドが完了すると、'listening' イベントが発生し、オプションの callback 関数が呼び出されます。

'listening' イベントリスナーを指定し、かつ socket.bind() メソッドに callback を渡すことは害にはなりませんが、あまり有用ではありません。

バインドされたデータグラムソケットは、データグラムメッセージを受信するためにNode.jsプロセスを実行し続けます。

バインドに失敗した場合、'error' イベントが発生します。まれなケース(例:閉じたソケットでバインドしようとする場合)では、Error がスローされることがあります。

ポート41234でリッスンするUDPサーバーの例

import dgram from 'node:dgram';

const server = dgram.createSocket('udp4');

server.on('error', (err) => {
  console.error(`server error:\n${err.stack}`);
  server.close();
});

server.on('message', (msg, rinfo) => {
  console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

server.on('listening', () => {
  const address = server.address();
  console.log(`server listening ${address.address}:${address.port}`);
});

server.bind(41234);
// Prints: server listening 0.0.0.0:41234const dgram = require('node:dgram');
const server = dgram.createSocket('udp4');

server.on('error', (err) => {
  console.error(`server error:\n${err.stack}`);
  server.close();
});

server.on('message', (msg, rinfo) => {
  console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

server.on('listening', () => {
  const address = server.address();
  console.log(`server listening ${address.address}:${address.port}`);
});

server.bind(41234);
// Prints: server listening 0.0.0.0:41234

socket.bind(options[, callback])#

UDPソケットの場合、dgram.Socket が、最初の引数として渡される options オブジェクトのプロパティとして渡される指定された port とオプションの address でデータグラムメッセージをリッスンするようにします。port が指定されていないか 0 の場合、オペレーティングシステムはランダムなポートにバインドしようとします。address が指定されていない場合、オペレーティングシステムはすべてのアドレスでリッスンしようとします。バインドが完了すると、'listening' イベントが発生し、オプションの callback 関数が呼び出されます。

options オブジェクトには fd プロパティを含めることができます。fd0 より大きい値に設定されると、指定されたファイルディスクリプタを持つ既存のソケットをラップします。この場合、portaddress のプロパティは無視されます。

'listening' イベントリスナーを指定し、かつ socket.bind() メソッドに callback を渡すことは害にはなりませんが、あまり有用ではありません。

options オブジェクトには、cluster モジュールで dgram.Socket オブジェクトを使用する際に使用される追加の exclusive プロパティを含めることができます。exclusivefalse(デフォルト)に設定されている場合、クラスターワーカーは同じ基盤となるソケットハンドルを使用し、接続処理の責務を共有できます。しかし、exclusivetrue の場合、ハンドルは共有されず、ポートの共有を試みるとエラーになります。reusePort オプションを true に設定して dgram.Socket を作成すると、socket.bind() が呼び出されるときに常に exclusivetrue になります。

バインドされたデータグラムソケットは、データグラムメッセージを受信するためにNode.jsプロセスを実行し続けます。

バインドに失敗した場合、'error' イベントが発生します。まれなケース(例:閉じたソケットでバインドしようとする場合)では、Error がスローされることがあります。

排他ポートでリッスンするソケットの例を以下に示します。

socket.bind({
  address: 'localhost',
  port: 8000,
  exclusive: true,
}); 

socket.close([callback])#

  • callback <Function> ソケットが閉じられたときに呼び出されます。

基盤となるソケットを閉じ、データのリッスンを停止します。コールバックが提供された場合、それは 'close' イベントのリスナーとして追加されます。

socket[Symbol.asyncDispose]()#

socket.close() を呼び出し、ソケットが閉じたときに解決されるプロミスを返します。

socket.connect(port[, address][, callback])#

dgram.Socket をリモートアドレスとポートに関連付けます。このハンドルによって送信されるすべてのメッセージは、自動的にその宛先に送信されます。また、ソケットはそのリモートピアからのみメッセージを受信します。すでに接続されているソケットで connect() を呼び出そうとすると、ERR_SOCKET_DGRAM_IS_CONNECTED 例外が発生します。address が提供されない場合、デフォルトで '127.0.0.1' (udp4 ソケットの場合) または '::1' (udp6 ソケットの場合) が使用されます。接続が完了すると、'connect' イベントが発生し、オプションの callback 関数が呼び出されます。失敗した場合、callback が呼び出されるか、それがなければ 'error' イベントが発生します。

socket.disconnect()#

接続された dgram.Socket をそのリモートアドレスから切断する同期関数です。バインドされていない、またはすでに切断されているソケットで disconnect() を呼び出そうとすると、ERR_SOCKET_DGRAM_NOT_CONNECTED 例外が発生します。

socket.dropMembership(multicastAddress[, multicastInterface])#

カーネルに対し、IP_DROP_MEMBERSHIP ソケットオプションを使用して multicastAddress のマルチキャストグループから離脱するように指示します。このメソッドは、ソケットが閉じられるかプロセスが終了するときにカーネルによって自動的に呼び出されるため、ほとんどのアプリがこれを呼び出す理由はありません。

multicastInterface が指定されていない場合、オペレーティングシステムはすべての有効なインターフェースでメンバーシップを削除しようとします。

socket.dropSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])#

カーネルに対し、IP_DROP_SOURCE_MEMBERSHIP ソケットオプションを使用して、指定された sourceAddressgroupAddress でソース固有のマルチキャストチャネルから離脱するように指示します。このメソッドは、ソケットが閉じられるかプロセスが終了するときにカーネルによって自動的に呼び出されるため、ほとんどのアプリがこれを呼び出す理由はありません。

multicastInterface が指定されていない場合、オペレーティングシステムはすべての有効なインターフェースでメンバーシップを削除しようとします。

socket.getRecvBufferSize()#

  • 戻り値: <number> SO_RCVBUF ソケット受信バッファサイズ(バイト単位)。

このメソッドは、バインドされていないソケットで呼び出されると ERR_SOCKET_BUFFER_SIZE をスローします。

socket.getSendBufferSize()#

  • 戻り値: <number> SO_SNDBUF ソケット送信バッファサイズ(バイト単位)。

このメソッドは、バインドされていないソケットで呼び出されると ERR_SOCKET_BUFFER_SIZE をスローします。

socket.getSendQueueSize()#

  • 戻り値: <number> 送信のためにキューに入れられているバイト数。

socket.getSendQueueCount()#

  • 戻り値: <number> 現在キューにあり、処理を待っている送信リクエストの数。

socket.ref()#

デフォルトでは、ソケットをバインドすると、ソケットが開いている限りNode.jsプロセスが終了するのをブロックします。socket.unref() メソッドを使用して、Node.jsプロセスをアクティブに保つ参照カウントからソケットを除外することができます。socket.ref() メソッドは、ソケットを参照カウントに戻し、デフォルトの動作を復元します。

socket.ref() を複数回呼び出しても、追加の効果はありません。

socket.ref() メソッドはソケットへの参照を返すので、呼び出しをチェーンできます。

socket.remoteAddress()#

リモートエンドポイントの addressfamilyport を含むオブジェクトを返します。このメソッドは、ソケットが接続されていない場合、ERR_SOCKET_DGRAM_NOT_CONNECTED 例外をスローします。

socket.send(msg[, offset, length][, port][, address][, callback])#

ソケット上でデータグラムをブロードキャストします。コネクションレスソケットの場合、宛先の portaddress を指定する必要があります。一方、接続済みソケットは、関連付けられたリモートエンドポイントを使用するため、portaddress 引数は設定してはいけません。

msg 引数には送信するメッセージが含まれます。その型に応じて、異なる動作が適用される場合があります。msgBuffer、任意の TypedArray、または DataView の場合、offsetlength は、メッセージが始まる Buffer 内のオフセットとメッセージのバイト数をそれぞれ指定します。msgString の場合、自動的に 'utf8' エンコーディングで Buffer に変換されます。マルチバイト文字を含むメッセージでは、offsetlength は文字位置ではなくバイト長に関して計算されます。msg が配列の場合、offsetlength は指定してはいけません。

address 引数は文字列です。address の値がホスト名の場合、DNSを使用してホストのアドレスを解決します。address が提供されないか、nullishな場合は、デフォルトで '127.0.0.1' (udp4 ソケットの場合) または '::1' (udp6 ソケットの場合) が使用されます。

ソケットが事前に bind の呼び出しでバインドされていない場合、ソケットにはランダムなポート番号が割り当てられ、「すべてのインターフェース」アドレス (udp4 ソケットの場合は '0.0.0.0'udp6 ソケットの場合は '::0') にバインドされます。

オプションの callback 関数は、DNSエラーを報告したり、buf オブジェクトを安全に再利用できるタイミングを判断する方法として指定できます。DNSルックアップは、Node.jsイベントループの少なくとも1ティック分、送信時間を遅延させます。

データグラムが送信されたことを確実に知る唯一の方法は、callback を使用することです。エラーが発生し、callback が与えられている場合、エラーは callback の最初の引数として渡されます。callback が与えられていない場合、エラーは socket オブジェクトの 'error' イベントとして発生します。

オフセットと長さはオプションですが、どちらかを使用する場合は両方を設定する必要があります。これらは、最初の引数が BufferTypedArray、または DataView の場合にのみサポートされます。

このメソッドは、バインドされていないソケットで呼び出されると ERR_SOCKET_BAD_PORT をスローします。

localhost のポートにUDPパケットを送信する例。

import dgram from 'node:dgram';
import { Buffer } from 'node:buffer';

const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.send(message, 41234, 'localhost', (err) => {
  client.close();
});const dgram = require('node:dgram');
const { Buffer } = require('node:buffer');

const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.send(message, 41234, 'localhost', (err) => {
  client.close();
});

127.0.0.1 のポートに複数のバッファで構成されるUDPパケットを送信する例。

import dgram from 'node:dgram';
import { Buffer } from 'node:buffer';

const buf1 = Buffer.from('Some ');
const buf2 = Buffer.from('bytes');
const client = dgram.createSocket('udp4');
client.send([buf1, buf2], 41234, (err) => {
  client.close();
});const dgram = require('node:dgram');
const { Buffer } = require('node:buffer');

const buf1 = Buffer.from('Some ');
const buf2 = Buffer.from('bytes');
const client = dgram.createSocket('udp4');
client.send([buf1, buf2], 41234, (err) => {
  client.close();
});

複数のバッファを送信することは、アプリケーションとオペレーティングシステムによっては速くなることも遅くなることもあります。ケースバイケースで最適な戦略を決定するためにベンチマークを実行してください。しかし、一般的に言えば、複数のバッファを送信する方が速いです。

localhost のポートに接続されたソケットを使用してUDPパケットを送信する例

import dgram from 'node:dgram';
import { Buffer } from 'node:buffer';

const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.connect(41234, 'localhost', (err) => {
  client.send(message, (err) => {
    client.close();
  });
});const dgram = require('node:dgram');
const { Buffer } = require('node:buffer');

const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.connect(41234, 'localhost', (err) => {
  client.send(message, (err) => {
    client.close();
  });
});
UDPデータグラムサイズに関する注意#

IPv4/v6データグラムの最大サイズは、MTU (最大伝送単位) と ペイロード長 フィールドのサイズに依存します。

  • ペイロード長 フィールドは16ビット幅であり、これは通常のペイロードがインターネットヘッダーとデータを含めて64Kオクテットを超えることができないことを意味します (65,507バイト = 65,535 − 8バイトのUDPヘッダー − 20バイトのIPヘッダー)。これは一般的にループバックインターフェースに当てはまりますが、このような長いデータグラムメッセージはほとんどのホストやネットワークにとって非現実的です。

  • MTUは、特定のリンク層技術がデータグラムメッセージに対してサポートできる最大のサイズです。どのリンクにおいても、IPv4は最小 MTU として68オクテットを義務付けていますが、IPv4で推奨される MTU は576です (通常、ダイヤルアップタイプのアプリケーションの MTU として推奨されます)。これは、パケットがそのまま到着するか断片化されて到着するかにかかわらずです。

    IPv6の場合、最小 MTU は1280オクテットです。ただし、必須の最小フラグメント再構成バッファサイズは1500オクテットです。イーサネットのような現在のほとんどのリンク層技術は最小 MTU が1500であるため、68オクテットという値は非常に小さいです。

パケットが通過する可能性のある各リンクのMTUを事前に知ることは不可能です。受信側の MTU よりも大きいデータグラムを送信しても機能しません。なぜなら、パケットは、データが意図した受信者に届かなかったことを送信元に通知することなく、静かにドロップされるからです。

socket.setBroadcast(flag)#

SO_BROADCAST ソケットオプションを設定またはクリアします。true に設定すると、UDPパケットをローカルインターフェースのブロードキャストアドレスに送信できます。

このメソッドは、バインドされていないソケットで呼び出されると EBADF をスローします。

socket.setMulticastInterface(multicastInterface)#

このセクションのスコープへのすべての参照は、IPv6ゾーンインデックス (Scoped literal IPv6 addresses) を指しており、これらは RFC 4007 で定義されています。文字列形式では、スコープインデックスを持つIPは 'IP%scope' のように記述され、ここで scope はインターフェース名またはインターフェース番号です。

ソケットのデフォルトの送信マルチキャストインターフェースを、選択したインターフェースに設定するか、システムのインターフェース選択に戻します。multicastInterface は、ソケットのファミリーからのIPの有効な文字列表現でなければなりません。

IPv4ソケットの場合、これは目的の物理インターフェースに設定されたIPであるべきです。ソケット上でマルチキャストに送信されるすべてのパケットは、この呼び出しの最新の成功した使用によって決定されたインターフェース上で送信されます。

IPv6ソケットの場合、multicastInterface には、以下の例のようにインターフェースを示すスコープを含める必要があります。IPv6では、個々の send 呼び出しもアドレスに明示的なスコープを使用できるため、明示的なスコープを指定せずにマルチキャストアドレスに送信されたパケットのみが、この呼び出しの最新の成功した使用の影響を受けます。

このメソッドは、バインドされていないソケットで呼び出されると EBADF をスローします。

例: IPv6 の送信マルチキャストインターフェース#

ほとんどのシステムでは、スコープ形式はインターフェース名を使用します

const socket = dgram.createSocket('udp6');

socket.bind(1234, () => {
  socket.setMulticastInterface('::%eth1');
}); 

Windowsでは、スコープ形式はインターフェース番号を使用します

const socket = dgram.createSocket('udp6');

socket.bind(1234, () => {
  socket.setMulticastInterface('::%2');
}); 
例: IPv4 の送信マルチキャストインターフェース#

すべてのシステムは、目的の物理インターフェース上のホストのIPを使用します

const socket = dgram.createSocket('udp4');

socket.bind(1234, () => {
  socket.setMulticastInterface('10.0.0.2');
}); 
呼び出し結果#

送信準備ができていない、またはもはや開いていないソケットでの呼び出しは、Not running Error をスローする可能性があります。

multicastInterface がIPに解析できない場合、EINVAL System Error がスローされます。

IPv4では、multicastInterface が有効なアドレスであるがどのインターフェースとも一致しない場合、またはアドレスがファミリーと一致しない場合、EADDRNOTAVAILEPROTONOSUP などの System Error がスローされます。

IPv6では、スコープの指定または省略に関するほとんどのエラーは、ソケットがシステムのデフォルトのインターフェース選択を使用し続ける(または戻る)結果となります。

ソケットのアドレスファミリーのANYアドレス(IPv4 '0.0.0.0' または IPv6 '::')を使用して、将来のマルチキャストパケットに対するソケットのデフォルトの送信インターフェースの制御をシステムに戻すことができます。

socket.setMulticastLoopback(flag)#

IP_MULTICAST_LOOP ソケットオプションを設定またはクリアします。true に設定すると、マルチキャストパケットはローカルインターフェースでも受信されます。

このメソッドは、バインドされていないソケットで呼び出されると EBADF をスローします。

socket.setMulticastTTL(ttl)#

IP_MULTICAST_TTL ソケットオプションを設定します。TTLは一般的に「Time to Live」を表しますが、この文脈では、パケットが通過できるIPホップの数を指定し、特にマルチキャストトラフィックに対して適用されます。パケットを転送する各ルーターまたはゲートウェイはTTLをデクリメントします。ルーターによってTTLが0にデクリメントされると、そのパケットは転送されません。

ttl 引数は0から255の間でなければなりません。ほとんどのシステムのデフォルトは 1 です。

このメソッドは、バインドされていないソケットで呼び出されると EBADF をスローします。

socket.setRecvBufferSize(size)#

SO_RCVBUF ソケットオプションを設定します。ソケットの最大受信バッファをバイト単位で設定します。

このメソッドは、バインドされていないソケットで呼び出されると ERR_SOCKET_BUFFER_SIZE をスローします。

socket.setSendBufferSize(size)#

SO_SNDBUF ソケットオプションを設定します。ソケットの最大送信バッファをバイト単位で設定します。

このメソッドは、バインドされていないソケットで呼び出されると ERR_SOCKET_BUFFER_SIZE をスローします。

socket.setTTL(ttl)#

IP_TTL ソケットオプションを設定します。TTLは一般的に「Time to Live」を表しますが、この文脈では、パケットが通過できるIPホップの数を指定します。パケットを転送する各ルーターまたはゲートウェイはTTLをデクリメントします。ルーターによってTTLが0にデクリメントされると、そのパケットは転送されません。TTL値の変更は、通常、ネットワークプローブやマルチキャスティングの際に行われます。

ttl 引数は1から255の間でなければなりません。ほとんどのシステムのデフォルトは64です。

このメソッドは、バインドされていないソケットで呼び出されると EBADF をスローします。

socket.unref()#

デフォルトでは、ソケットをバインドすると、ソケットが開いている限りNode.jsプロセスが終了するのをブロックします。socket.unref() メソッドを使用して、Node.jsプロセスをアクティブに保つ参照カウントからソケットを除外し、ソケットがまだリッスンしている場合でもプロセスが終了できるようにすることができます。

socket.unref() を複数回呼び出しても、追加の効果はありません。

socket.unref() メソッドはソケットへの参照を返すので、呼び出しをチェーンできます。

node:dgram モジュールの関数#

dgram.createSocket(options[, callback])#

  • options <Object> 利用可能なオプションは次のとおりです。
    • type <string> ソケットのファミリー。'udp4' または 'udp6' のいずれかでなければなりません。必須。
    • reuseAddr <boolean> true の場合、socket.bind() は、他のプロセスがすでにそのアドレスにソケットをバインドしていてもアドレスを再利用しますが、データを受信できるのは1つのソケットのみです。デフォルト: false
    • reusePort <boolean> true の場合、socket.bind() は、他のプロセスがすでにそのポートにソケットをバインドしていてもポートを再利用します。受信データグラムはリッスンしているソケットに分散されます。このオプションは、Linux 3.9+、DragonFlyBSD 3.6+、FreeBSD 12.0+、Solaris 11.4、AIX 7.2.5+などの一部のプラットフォームでのみ利用可能です。サポートされていないプラットフォームでは、ソケットがバインドされるときにこのオプションはエラーを発生させます。デフォルト: false
    • ipv6Only <boolean> ipv6Onlytrue に設定すると、デュアルスタックサポートが無効になります。つまり、アドレス :: にバインドしても 0.0.0.0 はバインドされません。デフォルト: false
    • recvBufferSize <number> SO_RCVBUF ソケット値を設定します。
    • sendBufferSize <number> SO_SNDBUF ソケット値を設定します。
    • lookup <Function> カスタムルックアップ関数。デフォルト: dns.lookup()
    • signal <AbortSignal> ソケットを閉じるために使用できる AbortSignal です。
    • receiveBlockList <net.BlockList> receiveBlockList は、特定のIPアドレス、IP範囲、またはIPサブネットへのインバウンドデータグラムを破棄するために使用できます。サーバーがリバースプロキシ、NATなどの背後にある場合、ブロックリストと照合されるアドレスはプロキシのアドレスまたはNATによって指定されたアドレスであるため、これは機能しません。
    • sendBlockList <net.BlockList> sendBlockList は、特定のIPアドレス、IP範囲、またはIPサブネットへのアウトバウンドアクセスを無効にするために使用できます。
  • callback <Function> 'message' イベントのリスナーとしてアタッチされます。オプション。
  • 戻り値: <dgram.Socket>

dgram.Socket オブジェクトを作成します。ソケットが作成された後、socket.bind() を呼び出すと、ソケットはデータグラムメッセージのリッスンを開始するように指示されます。addressportsocket.bind() に渡されない場合、メソッドはソケットをランダムなポートの「すべてのインターフェース」アドレスにバインドします(これは udp4udp6 の両方のソケットに対して適切に動作します)。バインドされたアドレスとポートは socket.address().addresssocket.address().port を使用して取得できます。

signal オプションが有効な場合、対応する AbortController.abort() を呼び出すことは、ソケットで .close() を呼び出すことと似ています。

const controller = new AbortController();
const { signal } = controller;
const server = dgram.createSocket({ type: 'udp4', signal });
server.on('message', (msg, rinfo) => {
  console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
// Later, when you want to close the server.
controller.abort(); 

dgram.createSocket(type[, callback])#

  • type <string> 'udp4' または 'udp6' のいずれか。
  • callback <Function> 'message' イベントのリスナーとしてアタッチされます。
  • 戻り値: <dgram.Socket>

指定された typedgram.Socket オブジェクトを作成します。

ソケットが作成された後、socket.bind() を呼び出すと、ソケットはデータグラムメッセージのリッスンを開始するように指示されます。addressportsocket.bind() に渡されない場合、メソッドはソケットをランダムなポートの「すべてのインターフェース」アドレスにバインドします(これは udp4udp6 の両方のソケットに対して適切に動作します)。バインドされたアドレスとポートは socket.address().addresssocket.address().port を使用して取得できます。