绑定 UDP 套接字(Bun.udpSocket())
要创建新的(绑定的)UDP 套接字:
ts
const socket = await Bun.udpSocket({});
console.log(socket.port); // 由操作系统分配指定端口:
ts
const socket = await Bun.udpSocket({
port: 41234,
});
console.log(socket.port); // 41234发送数据报
指定要发送的数据,以及目标端口和地址。
ts
socket.send("Hello, world!", 41234, "127.0.0.1");注意地址必须是有效的 IP 地址 - send 不执行 DNS 解析,因为它旨在用于低延迟操作。
接收数据报
在创建套接字时,添加回调以指定收到数据包时应执行的操作:
ts
const server = await Bun.udpSocket({
socket: {
data(socket, buf, port, addr) {
console.log(`来自 ${addr}:${port} 的消息:`);
console.log(buf.toString());
},
},
});
const client = await Bun.udpSocket({});
client.send("Hello!", server.port, "127.0.0.1");连接
虽然 UDP 没有连接的概念,但许多 UDP 通信(尤其是作为客户端)只涉及一个对等点。 在这种情况下,将套接字连接到该对等点可能有益,这指定了所有数据包发送到的地址 并限制仅从该对等点接收传入数据包。
ts
const server = await Bun.udpSocket({
socket: {
data(socket, buf, port, addr) {
console.log(`来自 ${addr}:${port} 的消息:`);
console.log(buf.toString());
},
},
});
const client = await Bun.udpSocket({
connect: {
port: server.port,
hostname: "127.0.0.1",
},
});
client.send("Hello");因为连接是在操作系统级别实现的,所以你也可能观察到性能优势。
使用 sendMany() 一次发送多个数据包
如果你想一次发送大量数据包,将它们批量处理在一起可以避免为每个数据包进行系统调用的开销。sendMany() API 使这成为可能:
对于未连接的套接字,sendMany 将数组作为唯一参数。每三个数组元素描述一个数据包: 第一项是要发送的数据,第二项是目标端口,最后一项是目标地址。
ts
const socket = await Bun.udpSocket({});
// 在单个操作中将 'Hello' 发送到 127.0.0.1:41234,将 'foo' 发送到 1.1.1.1:53
socket.sendMany(["Hello", 41234, "127.0.0.1", "foo", 53, "1.1.1.1"]);对于已连接的套接字,sendMany 只需一个数组,其中每个元素表示要发送到对等点的数据。
ts
const socket = await Bun.udpSocket({
connect: {
port: 41234,
hostname: "localhost",
},
});
socket.sendMany(["foo", "bar", "baz"]);sendMany 返回成功发送的数据包数量。与 send 一样,sendMany 只接受有效的 IP 地址作为目标,因为它不执行 DNS 解析。
处理背压
你发送的数据包可能不适合操作系统的数据包缓冲区。当发生这种情况时:
send返回falsesendMany返回的数字小于你指定的数据包数量。在这种情况下,一旦套接字再次可写,drain套接字处理程序将被调用:
ts
const socket = await Bun.udpSocket({
socket: {
drain(socket) {
// 继续发送数据
},
},
});