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