Node.js v21.7.2 ドキュメント
- Node.js v21.7.2
-
► 目次
- UDP/データグラムソケット
- クラス:
dgram.Socket
- イベント:
'close'
- イベント:
'connect'
- イベント:
'error'
- イベント:
'listening'
- イベント:
'message'
socket.addMembership(マルチキャストアドレス[, マルチキャストインターフェース])
socket.addSourceSpecificMembership(送信元アドレス, グループアドレス[, マルチキャストインターフェース])
socket.address()
socket.bind([ポート][, アドレス][, コールバック])
socket.bind(オプション[, コールバック])
socket.close([コールバック])
socket[Symbol.asyncDispose]()
socket.connect(ポート[, アドレス][, コールバック])
socket.disconnect()
socket.dropMembership(マルチキャストアドレス[, マルチキャストインターフェース])
socket.dropSourceSpecificMembership(送信元アドレス, グループアドレス[, マルチキャストインターフェース])
socket.getRecvBufferSize()
socket.getSendBufferSize()
socket.getSendQueueSize()
socket.getSendQueueCount()
socket.ref()
socket.remoteAddress()
socket.send(メッセージ[, オフセット, 長さ][, ポート][, アドレス][, コールバック])
socket.setBroadcast(フラグ)
socket.setMulticastInterface(マルチキャストインターフェース)
socket.setMulticastLoopback(フラグ)
socket.setMulticastTTL(ttl)
socket.setRecvBufferSize(サイズ)
socket.setSendBufferSize(サイズ)
socket.setTTL(ttl)
socket.unref()
- イベント:
node:dgram
モジュール関数
- クラス:
- UDP/データグラムソケット
-
► インデックス
- アサーションテスト
- 非同期コンテキスト追跡
- 非同期フック
- バッファ
- C++ アドオン
- Node-API を使用した C/C++ アドオン
- C++ エンベダー API
- 子プロセス
- クラスタ
- コマンドラインオプション
- コンソール
- Corepack
- 暗号
- デバッガ
- 非推奨 API
- 診断チャネル
- DNS
- ドメイン
- エラー
- イベント
- ファイルシステム
- グローバル
- HTTP
- HTTP/2
- HTTPS
- インスペクタ
- 国際化
- モジュール: CommonJS モジュール
- モジュール: ECMAScript モジュール
- モジュール:
node:module
API - モジュール: パッケージ
- Net
- OS
- パス
- パフォーマンスフック
- パーミッション
- プロセス
- Punycode
- クエリ文字列
- Readline
- REPL
- レポート
- 単一実行ファイルアプリケーション
- ストリーム
- 文字列デコーダ
- テストランナー
- タイマー
- TLS/SSL
- トレースイベント
- TTY
- UDP/データグラム
- URL
- ユーティリティ
- V8
- VM
- WASI
- Web Crypto API
- Web Streams API
- ワーカースレッド
- Zlib
- ► 他のバージョン
- ► オプション
UDP/データグラムソケット#
ソースコード: 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:41234
const 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
#
- 拡張: <EventEmitter>
データグラム機能をカプセル化します。
dgram.Socket
の新しいインスタンスは、dgram.createSocket()
を使用して作成されます。 new
キーワードは、dgram.Socket
インスタンスを作成するために使用しないでください。
イベント: 'close'
#
ソケットが close()
で閉じられた後、'close'
イベントが発行されます。 トリガーされると、このソケットでは新しい 'message'
イベントは発行されません。
イベント: 'connect'
#
'connect'
イベントは、正常な connect()
呼び出しの結果として、ソケットがリモートアドレスに関連付けられた後に発行されます。
イベント: `'error'` #
exception
<Error>
エラーが発生するたびに、'error'
イベントが発行されます。 イベントハンドラ関数には、単一の Error
オブジェクトが渡されます。
イベント: 'listening'
#
dgram.Socket
がアドレス指定可能になり、データを受信できるようになると、'listening'
イベントが発行されます。 これは、socket.bind()
で明示的に行われるか、socket.send()
を使用してデータが最初に送信されたときに暗黙的に行われます。 dgram.Socket
がリッスンするまで、基盤となるシステムリソースは存在せず、socket.address()
や socket.setTTL()
などの呼び出しは失敗します。
イベント: 'message'
#
ソケットで新しいデータグラムが利用可能になると、'message'
イベントが発行されます。 イベントハンドラ関数には、msg
と rinfo
の 2 つの引数が渡されます。
受信パケットの送信元アドレスが IPv6 リンクローカルアドレスの場合、インターフェース名が address
に追加されます。 たとえば、en0
インターフェースで受信したパケットのアドレスフィールドは、'fe80::2618:1234:ab11:3b9c%en0'
に設定されている場合があります。ここで、'%en0'
はゾーン ID サフィックスとしてのインターフェース名です。
socket.addMembership(マルチキャストアドレス[, マルチキャストインターフェース])
#
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(送信元アドレス, グループアドレス[, マルチキャストインターフェース])
#
IP_ADD_SOURCE_MEMBERSHIP
ソケットオプションを使用して、マルチキャストインターフェース
を使用して、指定された 送信元アドレス
と グループアドレス
で送信元固有のマルチキャストチャネルに参加するようにカーネルに指示します。 マルチキャストインターフェース
引数が指定されていない場合、オペレーティングシステムは 1 つのインターフェースを選択し、それにメンバーシップを追加します。 利用可能なすべてのインターフェースにメンバーシップを追加するには、インターフェースごとに 1 回、socket.addSourceSpecificMembership()
を複数回呼び出します。
バインドされていないソケットで呼び出されると、このメソッドは暗黙的にランダムなポートにバインドされ、すべてのインターフェースでリッスンします。
socket.address()
#
- 戻り値: <Object>
ソケットのアドレス情報を含むオブジェクトを返します。 UDP ソケットの場合、このオブジェクトには、address
、family
、および 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:41234
const 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])
#
options
<Object> 必須。以下のプロパティをサポートします。callback
<Function>
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]()
#
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])
#
`IP_DROP_MEMBERSHIP`ソケットオプションを使用して、`multicastAddress`のマルチキャストグループから離れるようにカーネルに指示します。このメソッドは、ソケットが閉じられたとき、またはプロセスが終了したときにカーネルによって自動的に呼び出されるため、ほとんどのアプリはこのメソッドを呼び出す理由がありません。
`multicastInterface`が指定されていない場合、オペレーティングシステムはすべての有効なインターフェースでメンバーシップを削除しようとします。
socket.dropSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])
#
`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()
#
- 戻り値: <dgram.Socket>
デフォルトでは、ソケットをバインドすると、ソケットが開いている限り、Node.jsプロセスが終了するのをブロックします。 `socket.unref()`メソッドを使用して、Node.jsプロセスをアクティブに保つ参照カウントからソケットを除外できます。 `socket.ref()`メソッドは、ソケットを参照カウントに再び追加し、デフォルトの動作を復元します。
`socket.ref()`を複数回呼び出しても、追加の効果はありません。
`socket.ref()`メソッドはソケットへの参照を返すため、呼び出しをチェーンできます。
socket.remoteAddress()
#
- 戻り値: <Object>
リモートエンドポイントの`address`、`family`、`port`を含むオブジェクトを返します。このメソッドは、ソケットが接続されていない場合、ERR_SOCKET_DGRAM_NOT_CONNECTED
例外をスローします。
socket.send(msg[, offset, length][, port][, address][, callback])
#
msg
<Buffer> | <TypedArray> | <DataView> | <string> | <Array> 送信されるメッセージ。offset
<integer> メッセージが開始されるバッファ内のオフセット。length
<integer> メッセージのバイト数。port
<integer> 宛先ポート。address
<string> 宛先ホスト名またはIPアドレス。callback
<Function> メッセージが送信されたときに呼び出されます。
ソケット上でデータグラムをブロードキャストします。コネクションレスソケットの場合、宛先`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'
イベントとして発行されます。
オフセットと長さはオプションですが、いずれかを使用する場合は *両方* を設定する必要があります。最初の引数が Buffer
、TypedArray
、または 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)
#
flag
<boolean>
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)
#
flag
<boolean>
IP_MULTICAST_LOOP
ソケットオプションを設定またはクリアします。true
に設定すると、マルチキャストパケットもローカルインターフェースで受信されます。
このメソッドは、バインドされていないソケットで呼び出されると EBADF
をスローします。
socket.setMulticastTTL(ttl)
#
ttl
<integer>
IP_MULTICAST_TTL
ソケットオプションを設定します。TTLは一般に「Time to Live」の略ですが、このコンテキストでは、特にマルチキャストトラフィックについて、パケットが通過できるIPホップの数を指定します。パケットを転送する各ルーターまたはゲートウェイは、TTLをデクリメントします。TTLがルーターによって0にデクリメントされた場合、転送されません。
ttl
引数は0から255の間です。ほとんどのシステムのデフォルトは 1
です。
このメソッドは、バインドされていないソケットで呼び出されると EBADF
をスローします。
socket.setRecvBufferSize(size)
#
size
<integer>
SO_RCVBUF
ソケットオプションを設定します。ソケットの最大受信バッファをバイト単位で設定します。
このメソッドは、バインドされていないソケットで呼び出されると、ERR_SOCKET_BUFFER_SIZE
をスローします。
socket.setSendBufferSize(size)
#
size
<integer>
SO_SNDBUF
ソケットオプションを設定します。ソケットの最大送信バッファをバイト単位で設定します。
このメソッドは、バインドされていないソケットで呼び出されると、ERR_SOCKET_BUFFER_SIZE
をスローします。
socket.setTTL(ttl)
#
ttl
<integer>
IP_TTL
ソケットオプションを設定します。TTLは一般に「Time to Live」の略ですが、このコンテキストでは、パケットが通過できるIPホップの数を指定します。パケットを転送する各ルーターまたはゲートウェイは、TTLをデクリメントします。TTLがルーターによって0にデクリメントされた場合、転送されません。TTL値の変更は、通常、ネットワークプローブまたはマルチキャスト時に実行されます。
ttl
引数は1から255の間です。ほとんどのシステムのデフォルトは64です。
このメソッドは、バインドされていないソケットで呼び出されると EBADF
をスローします。
socket.unref()
#
- 戻り値: <dgram.Socket>
デフォルトでは、ソケットをバインドすると、ソケットが開いている限り、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>ipv6Only
をtrue
に設定すると、デュアルスタックサポートが無効になります。つまり、アドレス::
にバインドしても、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()
に address
と port
が渡されない場合、メソッドはソケットをランダムなポートの「すべてのインターフェース」アドレスにバインドします(udp4
と udp6
の両方のソケットで正しく動作します)。バインドされたアドレスとポートは、socket.address().address
と socket.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>
指定された type
の dgram.Socket
オブジェクトを作成します。
ソケットが作成されると、socket.bind()
を呼び出すことで、ソケットはデータグラムメッセージのリスニングを開始します。 socket.bind()
に address
と port
が渡されない場合、メソッドはソケットをランダムなポートの「すべてのインターフェース」アドレスにバインドします(udp4
と udp6
の両方のソケットで正しく動作します)。バインドされたアドレスとポートは、socket.address().address
と socket.address().port
を使用して取得できます。