Skip to content

Vincular un socket UDP (Bun.udpSocket()) ​

Para crear un nuevo socket UDP (vinculado):

ts
const socket = await Bun.udpSocket({});
console.log(socket.port); // asignado por el sistema operativo

Especifica un puerto:

ts
const socket = await Bun.udpSocket({
  port: 41234, 
});

console.log(socket.port); // 41234

Enviar un datagrama ​

Especifica los datos a enviar, así como el puerto de destino y la dirección.

ts
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:

ts
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.

ts
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.

ts
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.

ts
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:

  • send devuelve false
  • sendMany devuelve un número menor que el número de paquetes que especificaste. En este caso, el manejador de socket drain se llamará una vez que el socket sea escribible nuevamente:
ts
const socket = await Bun.udpSocket({
  socket: {
    drain(socket) {
      // continuar enviando datos
    },
  },
});

Bun por www.bunjs.com.cn editar