Vincular un socket UDP (Bun.udpSocket())
Para crear un nuevo socket UDP (vinculado):
const socket = await Bun.udpSocket({});
console.log(socket.port); // asignado por el sistema operativoEspecifica un puerto:
const socket = await Bun.udpSocket({
port: 41234,
});
console.log(socket.port); // 41234Enviar un datagrama
Especifica los datos a enviar, así como el puerto de destino y la dirección.
socket.send("¡Hola, mundo!", 41234, "127.0.0.1");Nota que la dirección debe ser una dirección IP válida: send no realiza resolución DNS, ya que está diseñado para operaciones de baja latencia.
Recibir datagramas
Al crear tu socket, agrega un callback para especificar qué debe hacerse cuando se reciben paquetes:
const server = await Bun.udpSocket({
socket: {
data(socket, buf, port, addr) {
console.log(`mensaje de ${addr}:${port}:`);
console.log(buf.toString());
},
},
});
const client = await Bun.udpSocket({});
client.send("¡Hola!", server.port, "127.0.0.1");Conexiones
Aunque UDP no tiene un concepto de conexión, muchas comunicaciones UDP (especialmente como cliente) involucran solo un par. En tales casos, puede ser beneficioso conectar el socket a ese par, lo que especifica a qué dirección se envían todos los paquetes y restringe los paquetes entrantes solo a ese par.
const server = await Bun.udpSocket({
socket: {
data(socket, buf, port, addr) {
console.log(`mensaje de ${addr}:${port}:`);
console.log(buf.toString());
},
},
});
const client = await Bun.udpSocket({
connect: {
port: server.port,
hostname: "127.0.0.1",
},
});
client.send("Hola");Debido a que las conexiones se implementan a nivel del sistema operativo, potencialmente puedes observar beneficios de rendimiento también.
Enviar muchos paquetes a la vez usando sendMany()
Si quieres enviar un gran volumen de paquetes a la vez, puede tener sentido agruparlos todos juntos para evitar la sobrecarga de hacer una llamada al sistema por cada uno. Esto es posible gracias a la API sendMany():
Para un socket no conectado, sendMany toma un array como único argumento. Cada conjunto de tres elementos del array describe un paquete: El primer elemento son los datos a enviar, el segundo es el puerto de destino y el último es la dirección de destino.
const socket = await Bun.udpSocket({});
// envía 'Hola' a 127.0.0.1:41234 y 'foo' a 1.1.1.1:53 en una sola operación
socket.sendMany(["Hola", 41234, "127.0.0.1", "foo", 53, "1.1.1.1"]);Con un socket conectado, sendMany simplemente toma un array, donde cada elemento representa los datos a enviar al par.
const socket = await Bun.udpSocket({
connect: {
port: 41234,
hostname: "localhost",
},
});
socket.sendMany(["foo", "bar", "baz"]);sendMany devuelve el número de paquetes que se enviaron exitosamente. Al igual que send, sendMany solo toma direcciones IP válidas como destinos, ya que no realiza resolución DNS.
Manejar contrapresión
Puede suceder que un paquete que estás enviando no quepa en el búfer de paquetes del sistema operativo. Puedes detectar que esto ha sucedido cuando:
senddevuelvefalsesendManydevuelve un número menor que el número de paquetes que especificaste. En este caso, el manejador de socketdrainse llamará una vez que el socket sea escribible nuevamente:
const socket = await Bun.udpSocket({
socket: {
drain(socket) {
// continuar enviando datos
},
},
});