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])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
