Node.js v26.0.0 文档
- Node.js v26.0.0
- 目录
- UDP/数据报套接字 (UDP/datagram sockets)
- 类:
dgram.Socket- 事件:
'close' - 事件:
'connect' - 事件:
'error' - 事件:
'listening' - 事件:
'message' socket.addMembership(multicastAddress[, multicastInterface])socket.addSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])socket.address()socket.bind([port][, address][, callback])socket.bind(options[, callback])socket.close([callback])socket[Symbol.asyncDispose]()socket.connect(port[, address][, callback])socket.disconnect()socket.dropMembership(multicastAddress[, multicastInterface])socket.dropSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])socket.getRecvBufferSize()socket.getSendBufferSize()socket.getSendQueueSize()socket.getSendQueueCount()socket.ref()socket.remoteAddress()socket.send(msg[, offset, length][, port][, address][, callback])socket.setBroadcast(flag)socket.setMulticastInterface(multicastInterface)socket.setMulticastLoopback(flag)socket.setMulticastTTL(ttl)socket.setRecvBufferSize(size)socket.setSendBufferSize(size)socket.setTTL(ttl)socket.unref()
- 事件:
node:dgram模块函数
- 类:
- UDP/数据报套接字 (UDP/datagram sockets)
- 索引
- 关于本文档
- 用法与示例
- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲区
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入器 API
- 子进程
- 集群
- 命令行选项
- 控制台
- 加密
- 调试器
- 已弃用的 API
- 诊断通道
- DNS
- 域
- 环境变量
- 错误
- 事件
- 文件系统
- 全局对象
- HTTP
- HTTP/2
- HTTPS
- 检查器
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:moduleAPI - 模块:包
- 模块:TypeScript
- 网络
- 可迭代流 API
- 操作系统
- 路径
- 性能钩子
- 权限
- 进程
- Punycode
- 查询字符串
- 逐行读取
- REPL
- 报告
- 单一可执行文件应用
- SQLite
- 流
- 字符串解码器
- 测试运行器
- 定时器
- TLS/SSL
- 跟踪事件
- TTY
- UDP/数据报
- URL
- 实用工具
- V8
- 虚拟机
- WASI
- Web Crypto API
- Web Streams API
- 工作线程
- Zlib
- Zlib 可迭代压缩
- 其他版本
- 选项
UDP/数据报套接字#
稳定性:2 - 稳定
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#
- 扩展自:
<EventEmitter>
封装了数据报功能。
dgram.Socket 的新实例通过 dgram.createSocket() 创建。不应使用 new 关键字来创建 dgram.Socket 实例。
事件:'close'#
'close' 事件在套接字通过 close() 关闭后触发。一旦触发,此套接字上将不会再触发新的 'message' 事件。
事件:'connect'#
'connect' 事件在调用 connect() 成功后,将套接字关联到远程地址时触发。
事件:'error'#
exception<Error>
'error' 事件在发生任何错误时触发。事件处理函数会接收到一个 Error 对象。
事件:'listening'#
'listening' 事件在 dgram.Socket 可寻址并能接收数据时触发。这可以通过显式调用 socket.bind() 或首次使用 socket.send() 发送数据时隐式触发。在 dgram.Socket 监听之前,底层系统资源尚不存在,调用如 socket.address() 和 socket.setTTL() 等方法将会失败。
事件: 'message'#
'message' 事件在套接字收到新数据报时触发。事件处理函数接收两个参数:msg 和 rinfo。
如果传入数据包的源地址是 IPv6 本地链路地址,接口名称会被添加到 address 中。例如,在 en0 接口上接收到的数据包其地址字段可能被设为 'fe80::2618:1234:ab11:3b9c%en0',其中 '%en0' 是作为区域 ID 后缀的接口名称。
socket.addMembership(multicastAddress[, multicastInterface])#
通过 IP_ADD_MEMBERSHIP 套接字选项,告知内核加入指定 multicastAddress 和 multicastInterface 的组播组。如果未指定 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 套接字选项,利用 multicastInterface 告知内核加入指定的 sourceAddress 和 groupAddress 的源特定组播通道。如果未指定 multicastInterface 参数,操作系统将选择一个接口并加入成员身份。若要向所有可用接口添加成员身份,请多次调用 socket.addSourceSpecificMembership()(每个接口一次)。
在未绑定的套接字上调用此方法时,它会隐式绑定到随机端口,并在所有接口上监听。
socket.address()#
- 返回:
<Object>
返回包含套接字地址信息的对象。对于 UDP 套接字,此对象将包含 address、family 和 port 属性。
如果在未绑定的套接字上调用此方法,将抛出 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])#
options<Object>必需。支持以下属性callback<Function>
对于 UDP 套接字,使 dgram.Socket 在作为第一个参数传递的 options 对象中指定的 port 和可选的 address 上监听数据报消息。如果未指定 port 或为 0,操作系统将尝试绑定到随机端口。如果未指定 address,操作系统将尝试在所有地址上监听。绑定完成后,会触发 'listening' 事件并调用可选的 callback 函数。
options 对象可能包含 fd 属性。当设置了大于 0 的 fd 时,它将包装现有的具有该文件描述符的套接字。在这种情况下,port 和 address 属性将被忽略。
同时指定 'listening' 事件监听器并向 socket.bind() 方法传递 callback 是无害的,但作用不大。
options 对象可以包含一个额外的 exclusive 属性,该属性在使用带有 cluster 模块的 dgram.Socket 对象时使用。当 exclusive 设置为 false(默认值)时,集群工作进程将使用相同的底层套接字句柄,从而允许共享连接处理职责。然而,当 exclusive 为 true 时,句柄不被共享,且尝试端口共享会导致错误。当设置 reusePort 选项为 true 创建 dgram.Socket 时,调用 socket.bind() 时 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])#
port<integer>address<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()#
默认情况下,绑定套接字会使 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 分别指定缓冲区内消息开始的偏移量和消息中的字节数。如果 msg 是字符串,它将自动以 '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 事件循环的滴答时间。
确保数据报已发送的唯一方法是使用 callback。如果发生错误且给出了 callback,错误将作为第一个参数传递给 callback。如果未给出 callback,错误将作为 'error' 事件在 socket 对象上触发。
offset 和 length 是可选的,但如果使用,两者必须同时设置。它们仅在第一个参数为 Buffer、TypedArray 或 DataView 时受支持。
如果此方法在未绑定的套接字上调用,则会抛出 ERR_SOCKET_BAD_PORT 错误。
发送 UDP 数据包到 localhost 端口的示例;
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(最大传输单元)和 Payload Length(有效载荷长度)字段大小。
-
Payload Length字段为 16 位宽,意味着普通有效载荷(包括互联网头部和数据)不能超过 64K 八位字节(65,507 字节 = 65,535 − 8 字节 UDP 头部 − 20 字节 IP 头部);这通常适用于回环接口,但对于大多数主机和网络,如此长的数据报消息是不切实际的。 -
MTU是给定链路层技术支持的数据报消息的最大大小。对于任何链路,IPv4 强制要求最小MTU为 68 八位字节,而推荐的 IPv4MTU为 576(通常推荐作为拨号应用类型的MTU),无论它们是完整到达还是分片到达。对于 IPv6,最小
MTU为 1280 八位字节。然而,强制要求的最小分片重组缓冲区大小为 1500 八位字节。68 八位字节的值非常小,因为大多数当前的链路层技术(如以太网)的最小MTU为 1500。
无法预先知道数据包可能经过的每个链路的 MTU。发送大于接收端 MTU 的数据报将无法工作,因为数据包会被静默丢弃,且不会通知发送者数据未到达预期接收者。
socket.setBroadcast(flag)#
flag<boolean>
设置或清除 SO_BROADCAST 套接字选项。设置为 true 时,UDP 数据包可以发送到本地接口的广播地址。
如果在未绑定的套接字上调用此方法,将抛出 EBADF 错误。
socket.setMulticastInterface(multicastInterface)#
multicastInterface<string>
本节中对 scope(范围)的所有引用均指 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');
});
调用结果#
在未准备好发送或不再开启的套接字上进行调用可能会抛出 Not running 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 通常代表“生存时间”,但在本上下文中,它专门为组播流量指定数据包被允许经过的 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 通常代表“生存时间”,但在本上下文中,它指定数据包被允许经过的 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。reusePort<boolean>当为true时,socket.bind()将重用该端口,即使另一个进程已经绑定了该端口的套接字。传入的数据报会分发给监听的套接字。该选项仅在某些平台(如 Linux 3.9+、DragonFlyBSD 3.6+、FreeBSD 12.0+、Solaris 11.4 和 AIX 7.2.5+)上可用。在不支持的平台上,此选项在绑定套接字时会引发错误。默认: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。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() 将指示套接字开始监听数据报消息。当未向 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 获取。