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

安定性: 2 - 安定

ソースコード: 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'#

dgram.Socket がアドレス指定可能になり、データを受信できるようになると、'listening' イベントが発行されます。 これは、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 インターフェースで受信したパケットのアドレスフィールドは、'fe80::2618:1234:ab11:3b9c%en0' に設定されている場合があります。ここで、'%en0' はゾーン ID サフィックスとしてのインターフェース名です。

socket.addMembership(マルチキャストアドレス[, マルチキャストインターフェース])#

  • マルチキャストアドレス <string>
  • マルチキャストインターフェース <string>

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

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

複数の cluster ワーカー間で UDP ソケットを共有する場合、socket.addMembership() 関数は 1 回だけ呼び出す必要があります。そうでない場合、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(送信元アドレス, グループアドレス[, マルチキャストインターフェース])#

  • 送信元アドレス <string>
  • グループアドレス <string>
  • マルチキャストインターフェース <string>

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

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

socket.address()#

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

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

socket.bind([ポート][, アドレス][, コールバック])#

  • ポート <integer>
  • アドレス <string>
  • コールバック <Function> パラメータなし。 バインディングが完了すると呼び出されます。

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

'listening' イベントリスナーを指定し、socket.bind() メソッドに コールバック を渡しても害はありませんが、あまり役に立ちません。

バインドされたデータグラムソケットは、データグラムメッセージを受信するために 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ソケットの場合、第一引数として渡された`options`オブジェクトのプロパティとして渡された名前付き`port`とオプションの`address`で、データグラムメッセージをリッスンするように`dgram.Socket`を動作させます。 `port`が指定されていないか`0`の場合、オペレーティングシステムはランダムなポートにバインドしようとします。 `address`が指定されていない場合、オペレーティングシステムはすべてのアドレスでリッスンしようとします。バインドが完了すると、`'listening'`イベントが発行され、オプションの`callback`関数が呼び出されます。

`options`オブジェクトには、`fd`プロパティを含めることができます。 `0`より大きい`fd`が設定されている場合、指定されたファイル記述子を持つ既存のソケットをラップします。この場合、`port`と`address`のプロパティは無視されます。

'listening' イベントリスナーを指定し、socket.bind() メソッドに コールバック を渡しても害はありませんが、あまり役に立ちません。

`options`オブジェクトには、clusterモジュールで`dgram.Socket`オブジェクトを使用する場合に使用される追加の`exclusive`プロパティを含めることができます。 `exclusive`が`false`(デフォルト)に設定されている場合、クラスタワーカーは同じ基盤となるソケットハンドルを使用し、接続処理タスクを共有できます。ただし、`exclusive`が`true`の場合、ハンドルは共有されず、ポート共有の試行はエラーになります。

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

バインディングに失敗すると、'error' イベントが生成されます。 まれに(たとえば、閉じたソケットでバインドしようとした場合)、Error がスローされる場合があります。

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

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

socket.close([callback])#

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

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

socket[Symbol.asyncDispose]()#

安定性: 1 - 実験的

socket.close()を呼び出し、ソケットが閉じられたときに履行されるPromiseを返します。

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

  • ポート <integer>
  • アドレス <string>
  • callback <Function> 接続が完了したとき、またはエラーが発生したときに呼び出されます。

`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])#

  • マルチキャストアドレス <string>
  • マルチキャストインターフェース <string>

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

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

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

  • 送信元アドレス <string>
  • グループアドレス <string>
  • マルチキャストインターフェース <string>

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

`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()#

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

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

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

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

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();
});

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

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は最小68オクテットのMTUを義務付けていますが、IPv4の推奨MTUは576です(通常、ダイヤルアップタイプのアプリケーションのMTUとして推奨されます)。完全に到着するか、断片的に到着するかに関係なく)。

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

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

socket.setBroadcast(flag)#

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

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

socket.setMulticastInterface(multicastInterface)#

  • マルチキャストインターフェース <string>

このセクションのスコープへのすべての参照は、IPv6ゾーンインデックスを参照しています。これは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');
}); 
呼び出し結果#

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

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

IPv4では、multicastInterface が有効なアドレスであるが、どのインターフェースとも一致しない場合、またはアドレスがファミリと一致しない場合、EADDRNOTAVAIL または EPROTONOSUP などの 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() は、別のプロセスがすでにソケットをバインドしている場合でも、アドレスを再利用します。 **デフォルト:** false
    • ipv6Only <boolean> ipv6Onlytrue に設定すると、デュアルスタックサポートが無効になります。つまり、アドレス :: にバインドしても、0.0.0.0 はバインドされません。 **デフォルト:** false
    • recvBufferSize <number> SO_RCVBUF ソケット値を設定します。
    • sendBufferSize <number> SO_SNDBUF ソケット値を設定します。
    • lookup <Function> カスタムルックアップ関数。 **デフォルト:** dns.lookup()
    • signal <AbortSignal> ソケットを閉じるために使用される可能性のある AbortSignal。
  • callback <Function> 'message' イベントのリスナーとしてアタッチされます。オプション。
  • 戻り値: <dgram.Socket>

dgram.Socket オブジェクトを作成します。ソケットが作成されると、socket.bind() を呼び出すことで、ソケットはデータグラムメッセージのリスニングを開始します。 socket.bind()addressport が渡されない場合、メソッドはソケットをランダムなポートの「すべてのインターフェース」アドレスにバインドします(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() を呼び出すことで、ソケットはデータグラムメッセージのリスニングを開始します。 socket.bind()addressport が渡されない場合、メソッドはソケットをランダムなポートの「すべてのインターフェース」アドレスにバインドします(udp4udp6 の両方のソケットで正しく動作します)。バインドされたアドレスとポートは、socket.address().addresssocket.address().port を使用して取得できます。