Binden eines UDP-Sockets (Bun.udpSocket())
Um einen neuen (gebundenen) UDP-Socket zu erstellen:
const socket = await Bun.udpSocket({});
console.log(socket.port); // vom Betriebssystem zugewiesenEinen Port angeben:
const socket = await Bun.udpSocket({
port: 41234,
});
console.log(socket.port); // 41234Ein Datagramm senden
Geben Sie die zu sendenden Daten sowie den Zielport und die Zieladresse an.
socket.send("Hello, world!", 41234, "127.0.0.1");Beachten Sie, dass die Adresse eine gültige IP-Adresse sein muss – send führt keine DNS-Auflösung durch, da es für Latenz-kritische Operationen vorgesehen ist.
Datagramme empfangen
Fügen Sie beim Erstellen Ihres Sockets einen Callback hinzu, um anzugeben, was beim Empfang von Paketen geschehen soll:
const server = await Bun.udpSocket({
socket: {
data(socket, buf, port, addr) {
console.log(`Nachricht von ${addr}:${port}:`);
console.log(buf.toString());
},
},
});
const client = await Bun.udpSocket({});
client.send("Hello!", server.port, "127.0.0.1");Verbindungen
Während UDP kein Konzept einer Verbindung hat, beinhalten viele UDP-Kommunikationen (insbesondere als Client) nur einen Peer. In solchen Fällen kann es vorteilhaft sein, den Socket mit diesem Peer zu verbinden, was festlegt, an welche Adresse alle Pakete gesendet werden und eingehende Pakete nur auf diesen Peer beschränkt.
const server = await Bun.udpSocket({
socket: {
data(socket, buf, port, addr) {
console.log(`Nachricht von ${addr}:${port}:`);
console.log(buf.toString());
},
},
});
const client = await Bun.udpSocket({
connect: {
port: server.port,
hostname: "127.0.0.1",
},
});
client.send("Hello");Da Verbindungen auf Betriebssystemebene implementiert werden, können Sie potenziell auch Leistungsvorteile beobachten.
Viele Pakete auf einmal mit sendMany() senden
Wenn Sie eine große Anzahl von Paketen auf einmal senden möchten, kann es sinnvoll sein, sie alle zusammen zu batchen, um den Overhead eines Systemaufrufs für jedes Paket zu vermeiden. Dies wird durch die sendMany()-API ermöglicht:
Für einen unverbundenen Socket nimmt sendMany ein Array als einziges Argument. Jeder Satz von drei Array-Elementen beschreibt ein Paket: Das erste Element sind die zu sendenden Daten, das zweite ist der Zielport und das letzte ist die Zieladresse.
const socket = await Bun.udpSocket({});
// sendet 'Hello' an 127.0.0.1:41234 und 'foo' an 1.1.1.1:53 in einer einzigen Operation
socket.sendMany(["Hello", 41234, "127.0.0.1", "foo", 53, "1.1.1.1"]);Mit einem verbundenen Socket nimmt sendMany einfach ein Array, wobei jedes Element die an den Peer zu sendenden Daten darstellt.
const socket = await Bun.udpSocket({
connect: {
port: 41234,
hostname: "localhost",
},
});
socket.sendMany(["foo", "bar", "baz"]);sendMany gibt die Anzahl der erfolgreich gesendeten Pakete zurück. Wie bei send nimmt sendMany nur gültige IP-Adressen als Ziele an, da es keine DNS-Auflösung durchführt.
Backpressure behandeln
Es kann vorkommen, dass ein Paket, das Sie senden, nicht in den Paketpuffer des Betriebssystems passt. Sie können erkennen, dass dies geschehen ist, wenn:
sendgibtfalsezurücksendManygibt eine kleinere Zahl zurück als die Anzahl der Pakete, die Sie angegeben haben. In diesem Fall wird derdrain-Socket-Handler aufgerufen, sobald der Socket wieder beschreibbar ist:
const socket = await Bun.udpSocket({
socket: {
drain(socket) {
// weiter Daten senden
},
},
});