當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。