socket.send(msg[, offset, length][, port][, address][, callback])
版本 | 变化 |
---|---|
v17.0.0 |
|
v14.5.0、v12.19.0 |
|
v12.0.0 | 添加了对在连接的套接字上发送数据的支持。 |
v8.0.0 |
|
v8.0.0 |
|
v6.0.0 | 成功后,现在将使用 |
v5.7.0 |
|
v0.1.99 | 添加于:v0.1.99 |
参数
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
。对于包含 multi-byte 字符的消息,offset
和 length
将根据 byte length 而不是字符位置进行计算。如果msg
是数组,则不得指定offset
和length
。
address
参数是一个字符串。如果address
的值为主机名,DNS 将用于解析主机地址。如果未提供address
或以其他方式无效,则默认使用'127.0.0.1'
(用于udp4
套接字)或'::1'
(用于udp6
套接字)。
如果套接字之前没有与 bind
的调用绑定,则为套接字分配一个随机端口号并绑定到 "all interfaces" 地址('0.0.0.0'
用于 udp4
套接字,'::0'
用于 udp6
插座。)
可以指定可选的callback
函数作为报告DNS 错误或确定何时可以安全地重用buf
对象的一种方式。 DNS 查找延迟了至少一个 Node.js 事件循环的发送时间。
确定数据报已发送的唯一方法是使用 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(); });
向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(); });
根据应用程序和操作系统,发送多个缓冲区可能更快或更慢。运行基准测试以确定基于case-by-case 的最佳策略。然而,一般来说,发送多个缓冲区更快。
使用连接到 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 八位字节,包括 Internet 头和数据(65,507 字节 = 65,535 - 8 字节 UDP 头 - 20 字节 IP 头);这对于环回接口通常是正确的,但是对于大多数主机和网络来说,如此长的数据报消息是不切实际的。 -
MTU
是给定链路层技术可以支持的数据报消息的最大大小。对于任何链路,IPv4 要求至少 68 个八位字节的MTU
,而对于 IPv4 推荐的MTU
是 576(对于 dial-up 类型的应用程序,通常推荐为MTU
),无论它们是完整还是分段到达。对于 IPv6,最小的
MTU
是 1280 个八位字节。但是,强制的最小片段重组缓冲区大小为 1500 个八位字节。 68 个八位字节的值非常小,因为大多数当前的链路层技术(如以太网)的最小MTU
为 1500。
不可能事先知道数据包可能经过的每条链路的 MTU。发送大于接收者MTU
的数据报将不起作用,因为数据包将被静默丢弃,而不会通知源数据未到达其预期接收者。
相关用法
- Node.js dgram.Socket.setMulticastInterface(multicastInterface)用法及代码示例
- Node.js dgram.Socket.addMembership(multicastAddress[, multicastInterface])用法及代码示例
- Node.js dgram.Socket.bind(options[, callback])用法及代码示例
- Node.js dgram.Socket.bind([port][, address][, callback])用法及代码示例
- Node.js dgram.createSocket()用法及代码示例
- Node.js dgram.createSocket(options[, callback])用法及代码示例
- Node.js diffieHellman.getGenerator()用法及代码示例
- Node.js diffieHellman.setPrivateKey()用法及代码示例
- Node.js dns.resolveNs()用法及代码示例
- Node.js dnsPromises.lookup()用法及代码示例
- Node.js dns.resolveCname()用法及代码示例
- Node.js diagnostics_channel.hasSubscribers(name)用法及代码示例
- Node.js dns.resolveSrv(hostname, callback)用法及代码示例
- Node.js diagnostics_channel.channel(name)用法及代码示例
- Node.js dnsPromises.resolveMx()用法及代码示例
- Node.js dnsPromises.resolveTxt()用法及代码示例
- Node.js dnsPromises.resolve()用法及代码示例
- Node.js diffieHellman.getPrime()用法及代码示例
- Node.js dnsPromises.resolveAny(hostname)用法及代码示例
- Node.js dnsPromises.resolve6()用法及代码示例
- Node.js dnsPromises.resolveSrv(hostname)用法及代码示例
- Node.js dns.resolveSoa()用法及代码示例
- Node.js dnsPromises.resolveSoa(hostname)用法及代码示例
- Node.js dns.resolve()用法及代码示例
- Node.js dns.resolveSoa(hostname, callback)用法及代码示例
注:本文由纯净天空筛选整理自nodejs.org大神的英文原创作品 dgram.Socket.send(msg[, offset, length][, port][, address][, callback])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。