当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Node.js dgram.Socket.send(msg[, offset, length][, port][, address][, callback])用法及代码示例


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

历史
版本变化
v17.0.0

address 参数现在只接受 stringnullundefined

v14.5.0、v12.19.0

msg 参数现在可以是任何 TypedArrayDataView

v12.0.0

添加了对在连接的套接字上发送数据的支持。

v8.0.0

msg 参数现在可以是 Uint8Array

v8.0.0

address 参数现在始终是可选的。

v6.0.0

成功后,现在将使用 null 而不是 0error 参数调用 callback

v5.7.0

msg 参数现在可以是一个数组。此外,offsetlength 参数现在是可选的。

v0.1.99

添加于:v0.1.99


参数

在套接字上广播数据报。对于无连接套接字,必须指定目标 portaddress。另一方面,已连接的套接字将使用其关联的远程端点,因此不得设置 portaddress 参数。

msg 参数包含要发送的消息。根据其类型,可以应用不同的行为。如果 msgBuffer 、任何 TypedArrayDataView ,则 offsetlength 分别指定消息开始的 Buffer 内的偏移量和消息中的字节数.如果 msgString ,那么它会自动转换为带有 'utf8' 编码的 Buffer。对于包含 multi-byte 字符的消息,offsetlength 将根据 byte length 而不是字符位置进行计算。如果msg 是数组,则不得指定offsetlength

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' 事件发出。

偏移量和长度是可选的,但如果使用任何一个,都必须设置。仅当第一个参数是 BufferTypedArrayDataView 时才支持它们。

如果在未绑定的套接字上调用此方法,则会抛出 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 的数据报将不起作用,因为数据包将被静默丢弃,而不会通知源数据未到达其预期接收者。

相关用法


注:本文由纯净天空筛选整理自nodejs.org大神的英文原创作品 dgram.Socket.send(msg[, offset, length][, port][, address][, callback])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。