Skip to content

Sockets UDP/datagram

[Estable: 2 - Estable]

Estable: 2 Estabilidad: 2 - Estable

Código fuente: lib/dgram.js

El módulo node:dgram proporciona una implementación de sockets de datagramas UDP.

js
import dgram from 'node:dgram'

const server = dgram.createSocket('udp4')

server.on('error', err => {
  console.error(`error del servidor:\n${err.stack}`)
  server.close()
})

server.on('message', (msg, rinfo) => {
  console.log(`servidor recibió: ${msg} desde ${rinfo.address}:${rinfo.port}`)
})

server.on('listening', () => {
  const address = server.address()
  console.log(`servidor escuchando ${address.address}:${address.port}`)
})

server.bind(41234)
// Imprime: servidor escuchando 0.0.0.0:41234
js
const dgram = require('node:dgram')
const server = dgram.createSocket('udp4')

server.on('error', err => {
  console.error(`error del servidor:\n${err.stack}`)
  server.close()
})

server.on('message', (msg, rinfo) => {
  console.log(`servidor recibió: ${msg} desde ${rinfo.address}:${rinfo.port}`)
})

server.on('listening', () => {
  const address = server.address()
  console.log(`servidor escuchando ${address.address}:${address.port}`)
})

server.bind(41234)
// Imprime: servidor escuchando 0.0.0.0:41234

Clase: dgram.Socket

Añadido en: v0.1.99

Encapsula la funcionalidad de datagramas.

Las nuevas instancias de dgram.Socket se crean usando dgram.createSocket(). La palabra clave new no debe usarse para crear instancias de dgram.Socket.

Evento: 'close'

Añadido en: v0.1.99

El evento 'close' se emite después de que un socket se cierra con close(). Una vez activado, no se emitirán nuevos eventos 'message' en este socket.

Evento: 'connect'

Añadido en: v12.0.0

El evento 'connect' se emite después de que un socket se asocia a una dirección remota como resultado de una llamada exitosa a connect().

Evento: 'error'

Añadido en: v0.1.99

El evento 'error' se emite cada vez que ocurre un error. La función del controlador de eventos recibe un único objeto Error.

Evento: 'listening'

Añadido en: v0.1.99

El evento 'listening' se emite una vez que el dgram.Socket es direccionable y puede recibir datos. Esto ocurre explícitamente con socket.bind() o implícitamente la primera vez que se envían datos usando socket.send(). Hasta que el dgram.Socket esté escuchando, los recursos del sistema subyacentes no existen y las llamadas como socket.address() y socket.setTTL() fallarán.

Evento: 'message'

[Historial]

VersiónCambios
v18.4.0La propiedad family ahora devuelve una cadena en lugar de un número.
v18.0.0La propiedad family ahora devuelve un número en lugar de una cadena.
v0.1.99Añadido en: v0.1.99

El evento 'message' se emite cuando hay un nuevo datagrama disponible en un socket. La función del controlador de eventos recibe dos argumentos: msg y rinfo.

  • msg <Buffer> El mensaje.
  • rinfo <Object> Información de la dirección remota.
    • address <string> La dirección del remitente.
    • family <string> La familia de direcciones ('IPv4' o 'IPv6').
    • port <number> El puerto del remitente.
    • size <number> El tamaño del mensaje.

Si la dirección de origen del paquete entrante es una dirección IPv6 de enlace local, el nombre de la interfaz se agrega a la address. Por ejemplo, un paquete recibido en la interfaz en0 podría tener el campo de dirección establecido en 'fe80::2618:1234:ab11:3b9c%en0', donde '%en0' es el nombre de la interfaz como sufijo de ID de zona.

socket.addMembership(multicastAddress[, multicastInterface])

Añadido en: v0.6.9

Le indica al kernel que se una a un grupo de multidifusión en la multicastAddress y multicastInterface dadas usando la opción de socket IP_ADD_MEMBERSHIP. Si no se especifica el argumento multicastInterface, el sistema operativo elegirá una interfaz y añadirá la membresía a ella. Para añadir la membresía a cada interfaz disponible, llame a addMembership varias veces, una vez por interfaz.

Cuando se llama a un socket no enlazado, este método se enlazará implícitamente a un puerto aleatorio, escuchando en todas las interfaces.

Cuando se comparte un socket UDP entre varios trabajadores de cluster, la función socket.addMembership() debe llamarse solo una vez o se producirá un error EADDRINUSE:

js
import cluster from 'node:cluster'
import dgram from 'node:dgram'

if (cluster.isPrimary) {
  cluster.fork() // Funciona correctamente.
  cluster.fork() // Falla con EADDRINUSE.
} else {
  const s = dgram.createSocket('udp4')
  s.bind(1234, () => {
    s.addMembership('224.0.0.114')
  })
}
js
const cluster = require('node:cluster')
const dgram = require('node:dgram')

if (cluster.isPrimary) {
  cluster.fork() // Funciona correctamente.
  cluster.fork() // Falla con EADDRINUSE.
} else {
  const s = dgram.createSocket('udp4')
  s.bind(1234, () => {
    s.addMembership('224.0.0.114')
  })
}

socket.addSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])

Añadido en: v13.1.0, v12.16.0

Le indica al kernel que se una a un canal multicast específico de la fuente en la sourceAddress y groupAddress dadas, utilizando la multicastInterface con la opción de socket IP_ADD_SOURCE_MEMBERSHIP. Si no se especifica el argumento multicastInterface, el sistema operativo elegirá una interfaz y añadirá la membresía a ella. Para añadir la membresía a todas las interfaces disponibles, llame a socket.addSourceSpecificMembership() varias veces, una vez por interfaz.

Cuando se llama a un socket no enlazado, este método se enlazará implícitamente a un puerto aleatorio, escuchando en todas las interfaces.

socket.address()

Añadido en: v0.1.99

Devuelve un objeto que contiene la información de la dirección de un socket. Para sockets UDP, este objeto contendrá las propiedades address, family y port.

Este método lanza EBADF si se llama en un socket no enlazado.

socket.bind([port][, address][, callback])

[Historial]

VersiónCambios
v0.9.1El método se cambió a un modelo de ejecución asincrónica. El código heredado debería cambiarse para pasar una función de devolución de llamada a la llamada al método.
v0.1.99Añadido en: v0.1.99

Para sockets UDP, hace que el dgram.Socket escuche mensajes de datagrama en un port nombrado y una dirección opcional address. Si port no se especifica o es 0, el sistema operativo intentará enlazarse a un puerto aleatorio. Si address no se especifica, el sistema operativo intentará escuchar en todas las direcciones. Una vez que se completa el enlace, se emite un evento 'listening' y se llama a la función callback opcional.

Especificar tanto un escuchador de eventos 'listening' como pasar una callback al método socket.bind() no es perjudicial, pero no es muy útil.

Un socket de datagrama enlazado mantiene el proceso Node.js en ejecución para recibir mensajes de datagrama.

Si falla el enlace, se genera un evento 'error'. En casos raros (por ejemplo, intentar enlazar con un socket cerrado), se puede lanzar un Error.

Ejemplo de un servidor UDP escuchando en el puerto 41234:

js
import dgram from 'node:dgram'

const server = dgram.createSocket('udp4')

server.on('error', err => {
  console.error(`error del servidor:\n${err.stack}`)
  server.close()
})

server.on('message', (msg, rinfo) => {
  console.log(`servidor recibió: ${msg} de ${rinfo.address}:${rinfo.port}`)
})

server.on('listening', () => {
  const address = server.address()
  console.log(`servidor escuchando ${address.address}:${address.port}`)
})

server.bind(41234)
// Imprime: servidor escuchando 0.0.0.0:41234
js
const dgram = require('node:dgram')
const server = dgram.createSocket('udp4')

server.on('error', err => {
  console.error(`error del servidor:\n${err.stack}`)
  server.close()
})

server.on('message', (msg, rinfo) => {
  console.log(`servidor recibió: ${msg} de ${rinfo.address}:${rinfo.port}`)
})

server.on('listening', () => {
  const address = server.address()
  console.log(`servidor escuchando ${address.address}:${address.port}`)
})

server.bind(41234)
// Imprime: servidor escuchando 0.0.0.0:41234

socket.bind(options[, callback])

Añadido en: v0.11.14

Para sockets UDP, hace que el dgram.Socket escuche mensajes de datagrama en un port nombrado y una dirección address opcional que se pasan como propiedades de un objeto options pasado como primer argumento. Si port no se especifica o es 0, el sistema operativo intentará enlazar a un puerto aleatorio. Si address no se especifica, el sistema operativo intentará escuchar en todas las direcciones. Una vez que se completa el enlace, se emite un evento 'listening' y se llama a la función callback opcional.

El objeto options puede contener una propiedad fd. Cuando se establece un fd mayor que 0, se envolverá alrededor de un socket existente con el descriptor de archivo dado. En este caso, se ignorarán las propiedades de port y address.

Especificar tanto un escuchador de eventos 'listening' como pasar un callback al método socket.bind() no es dañino pero no es muy útil.

El objeto options puede contener una propiedad exclusive adicional que se utiliza cuando se utilizan objetos dgram.Socket con el módulo cluster. Cuando exclusive se establece en false (el valor predeterminado), los trabajadores del clúster usarán el mismo controlador de socket subyacente, permitiendo que se compartan las tareas de manejo de conexiones. Sin embargo, cuando exclusive es true, el controlador no se comparte y los intentos de compartir puertos resultan en un error. Crear un dgram.Socket con la opción reusePort establecida en true hace que exclusive siempre sea true cuando se llama a socket.bind().

Un socket de datagrama enlazado mantiene el proceso Node.js en ejecución para recibir mensajes de datagrama.

Si el enlace falla, se genera un evento 'error'. En casos raros (por ejemplo, intentar enlazar con un socket cerrado), se puede lanzar un Error.

A continuación se muestra un ejemplo de socket que escucha en un puerto exclusivo.

js
socket.bind({
  address: 'localhost',
  port: 8000,
  exclusive: true,
})

socket.close([callback])

Añadido en: v0.1.99

  • callback <Function> Llamado cuando el socket ha sido cerrado.

Cierra el socket subyacente y deja de escuchar datos en él. Si se proporciona un callback, se agrega como un listener para el evento 'close'.

socket[Symbol.asyncDispose]()

Añadido en: v20.5.0, v18.18.0

[Estable: 1 - Experimental]

Estable: 1 Estabilidad: 1 - Experimental

Llama a socket.close() y devuelve una promesa que se cumple cuando el socket se ha cerrado.

socket.connect(port[, address][, callback])

Añadido en: v12.0.0

Asocia el dgram.Socket a una dirección y puerto remotos. Cada mensaje enviado por este manejador se envía automáticamente a ese destino. Además, el socket solo recibirá mensajes de ese par remoto. Intentar llamar a connect() en un socket ya conectado resultará en una excepción ERR_SOCKET_DGRAM_IS_CONNECTED. Si no se proporciona address, se utilizará '127.0.0.1' (para sockets udp4) o '::1' (para sockets udp6) de forma predeterminada. Una vez que se completa la conexión, se emite un evento 'connect' y se llama a la función callback opcional. En caso de fallo, se llama al callback o, si falla esto, se emite un evento 'error'.

socket.disconnect()

Añadido en: v12.0.0

Una función síncrona que disocia un dgram.Socket conectado de su dirección remota. Intentar llamar a disconnect() en un socket no enlazado o ya desconectado resultará en una excepción ERR_SOCKET_DGRAM_NOT_CONNECTED.

socket.dropMembership(multicastAddress[, multicastInterface])

Añadido en: v0.6.9

Instruye al núcleo a abandonar un grupo multidifusión en multicastAddress usando la opción de socket IP_DROP_MEMBERSHIP. Este método es llamado automáticamente por el núcleo cuando el socket se cierra o el proceso termina, por lo que la mayoría de las aplicaciones nunca tendrán razón para llamarlo.

Si multicastInterface no se especifica, el sistema operativo intentará abandonar la membresía en todas las interfaces válidas.

socket.dropSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])

Añadido en: v13.1.0, v12.16.0

Instruye al kernel a abandonar un canal multicast específico de la fuente en la sourceAddress y groupAddress dadas usando la opción de socket IP_DROP_SOURCE_MEMBERSHIP. Este método es llamado automáticamente por el kernel cuando el socket se cierra o el proceso termina, así que la mayoría de las aplicaciones nunca tendrán razón para llamarlo.

Si multicastInterface no está especificado, el sistema operativo intentará abandonar la membresía en todas las interfaces válidas.

socket.getRecvBufferSize()

Añadido en: v8.7.0

  • Devuelve: <number> el tamaño del búfer de recepción del socket SO_RCVBUF en bytes.

Este método lanza ERR_SOCKET_BUFFER_SIZE si se llama en un socket no enlazado.

socket.getSendBufferSize()

Añadido en: v8.7.0

  • Devuelve: <number> el tamaño del búfer de envío del socket SO_SNDBUF en bytes.

Este método lanza ERR_SOCKET_BUFFER_SIZE si se llama en un socket no enlazado.

socket.getSendQueueSize()

Añadido en: v18.8.0, v16.19.0

  • Devuelve: <number> Número de bytes en cola para enviar.

socket.getSendQueueCount()

Añadido en: v18.8.0, v16.19.0

  • Devuelve: <number> Número de solicitudes de envío actualmente en la cola esperando ser procesadas.

socket.ref()

Añadido en: v0.9.1

Por defecto, enlazar un socket hará que bloquee la salida del proceso Node.js mientras el socket esté abierto. El método socket.unref() se puede usar para excluir el socket del conteo de referencias que mantiene activo el proceso Node.js. El método socket.ref() agrega el socket de vuelta al conteo de referencias y restaura el comportamiento predeterminado.

Llamar a socket.ref() múltiples veces no tendrá ningún efecto adicional.

El método socket.ref() devuelve una referencia al socket para que las llamadas puedan encadenarse.

socket.remoteAddress()

Añadido en: v12.0.0

Devuelve un objeto que contiene la address, family, y port del punto final remoto. Este método lanza una excepción ERR_SOCKET_DGRAM_NOT_CONNECTED si el socket no está conectado.

socket.send(msg[, offset, length][, port][, address][, callback])

[Historial]

VersiónCambios
v17.0.0El parámetro address ahora solo acepta una string, null o undefined.
v14.5.0, v12.19.0El parámetro msg ahora puede ser cualquier TypedArray o DataView.
v12.0.0Añadida la compatibilidad para enviar datos en sockets conectados.
v8.0.0El parámetro msg ahora puede ser un Uint8Array.
v8.0.0El parámetro address ahora es siempre opcional.
v6.0.0En caso de éxito, callback ahora se llamará con un argumento error de null en lugar de 0.
v5.7.0El parámetro msg ahora puede ser un array. Además, los parámetros offset y length ahora son opcionales.
v0.1.99Añadido en: v0.1.99

Difunde un datagrama en el socket. Para sockets sin conexión, el puerto y la dirección de destino deben especificarse. Los sockets conectados, por otro lado, usarán su punto final remoto asociado, por lo que los argumentos port y address no deben establecerse.

El argumento msg contiene el mensaje a ser enviado. Dependiendo de su tipo, se puede aplicar un comportamiento diferente. Si msg es un Buffer, cualquier TypedArray o un DataView, offset y length especifican el desplazamiento dentro del Buffer donde comienza el mensaje y el número de bytes en el mensaje, respectivamente. Si msg es una String, entonces se convierte automáticamente a un Buffer con codificación 'utf8'. Con mensajes que contienen caracteres multibyte, offset y length se calcularán con respecto a la longitud en bytes y no a la posición del carácter. Si msg es un array, offset y length no deben especificarse.

El argumento address es una cadena. Si el valor de address es un nombre de host, se utilizará DNS para resolver la dirección del host. Si address no se proporciona o es nulo, se utilizará '127.0.0.1' (para sockets udp4) o '::1' (para sockets udp6) de forma predeterminada.

Si el socket no se ha enlazado previamente con una llamada a bind, al socket se le asigna un número de puerto aleatorio y se enlaza a la dirección de "todas las interfaces" ('0.0.0.0' para sockets udp4, '::0' para sockets udp6).

Se puede especificar una función callback opcional como una forma de informar sobre errores de DNS o para determinar cuándo es seguro reutilizar el objeto buf. Las búsquedas DNS retrasan el tiempo de envío durante al menos un tick del bucle de eventos de Node.js.

La única manera de saber con seguridad que el datagrama se ha enviado es utilizando un callback. Si se produce un error y se proporciona un callback, el error se pasará como primer argumento al callback. Si no se proporciona un callback, el error se emite como un evento 'error' en el objeto socket.

Offset y length son opcionales, pero ambos deben establecerse si se utiliza alguno de ellos. Son compatibles solo cuando el primer argumento es un Buffer, un TypedArray o un DataView.

Este método lanza ERR_SOCKET_BAD_PORT si se llama en un socket no enlazado.

Ejemplo de envío de un paquete UDP a un puerto en localhost;

js
import dgram from 'node:dgram'
import { Buffer } from 'node:buffer'

const message = Buffer.from('Algunos bytes')
const client = dgram.createSocket('udp4')
client.send(message, 41234, 'localhost', err => {
  client.close()
})
js
const dgram = require('node:dgram')
const { Buffer } = require('node:buffer')

const message = Buffer.from('Algunos bytes')
const client = dgram.createSocket('udp4')
client.send(message, 41234, 'localhost', err => {
  client.close()
})

Ejemplo de envío de un paquete UDP compuesto de múltiples buffers a un puerto en 127.0.0.1;

js
import dgram from 'node:dgram'
import { Buffer } from 'node:buffer'

const buf1 = Buffer.from('Algunos ')
const buf2 = Buffer.from('bytes')
const client = dgram.createSocket('udp4')
client.send([buf1, buf2], 41234, err => {
  client.close()
})
js
const dgram = require('node:dgram')
const { Buffer } = require('node:buffer')

const buf1 = Buffer.from('Algunos ')
const buf2 = Buffer.from('bytes')
const client = dgram.createSocket('udp4')
client.send([buf1, buf2], 41234, err => {
  client.close()
})

El envío de múltiples buffers puede ser más rápido o más lento dependiendo de la aplicación y el sistema operativo. Ejecute pruebas de rendimiento para determinar la estrategia óptima caso por caso. En general, sin embargo, enviar múltiples buffers es más rápido.

Ejemplo de envío de un paquete UDP usando un socket conectado a un puerto en localhost:

js
import dgram from 'node:dgram'
import { Buffer } from 'node:buffer'

const message = Buffer.from('Algunos bytes')
const client = dgram.createSocket('udp4')
client.connect(41234, 'localhost', err => {
  client.send(message, err => {
    client.close()
  })
})
js
const dgram = require('node:dgram')
const { Buffer } = require('node:buffer')

const message = Buffer.from('Algunos bytes')
const client = dgram.createSocket('udp4')
client.connect(41234, 'localhost', err => {
  client.send(message, err => {
    client.close()
  })
})

Nota sobre el tamaño del datagrama UDP

El tamaño máximo de un datagrama IPv4/v6 depende de la MTU (Unidad Máxima de Transmisión) y del tamaño del campo Longitud de la Carga Útil.

  • El campo Longitud de la Carga Útil tiene 16 bits de ancho, lo que significa que una carga útil normal no puede exceder los 64K octetos incluyendo la cabecera de internet y los datos (65.507 bytes = 65.535 − 8 bytes de cabecera UDP − 20 bytes de cabecera IP); esto es generalmente cierto para las interfaces de bucle invertido, pero esos mensajes de datagramas tan largos son imprácticos para la mayoría de los hosts y redes.
  • La MTU es el tamaño máximo que una determinada tecnología de capa de enlace puede soportar para mensajes de datagramas. Para cualquier enlace, IPv4 exige una MTU mínima de 68 octetos, mientras que la MTU recomendada para IPv4 es 576 (típicamente recomendada como MTU para aplicaciones de tipo dial-up), ya sea que lleguen completas o fragmentadas. Para IPv6, la MTU mínima es de 1280 octetos. Sin embargo, el tamaño mínimo obligatorio del búfer de reensamblaje de fragmentos es de 1500 octetos. El valor de 68 octetos es muy pequeño, ya que la mayoría de las tecnologías de capa de enlace actuales, como Ethernet, tienen una MTU mínima de 1500.

Es imposible saber de antemano la MTU de cada enlace a través del cual podría viajar un paquete. Enviar un datagrama mayor que la MTU del receptor no funcionará porque el paquete se descartará silenciosamente sin informar a la fuente de que los datos no llegaron a su destinatario previsto.

socket.setBroadcast(flag)

Añadido en: v0.6.9

Establece o borra la opción de socket SO_BROADCAST. Cuando se establece en true, los paquetes UDP pueden enviarse a la dirección de broadcast de una interfaz local.

Este método lanza EBADF si se llama en un socket no enlazado.

socket.setMulticastInterface(multicastInterface)

Añadido en: v8.6.0

Todas las referencias al ámbito en esta sección se refieren a índices de zona IPv6, que están definidos por RFC 4007. En forma de cadena, una IP con un índice de ámbito se escribe como 'IP%scope' donde scope es un nombre de interfaz o un número de interfaz.

Establece la interfaz de multidifusión saliente predeterminada del socket a una interfaz elegida o vuelve a la selección de interfaz del sistema. multicastInterface debe ser una representación de cadena válida de una IP de la familia del socket.

Para sockets IPv4, esto debería ser la IP configurada para la interfaz física deseada. Todos los paquetes enviados a multidifusión en el socket se enviarán en la interfaz determinada por el uso exitoso más reciente de esta llamada.

Para sockets IPv6, multicastInterface debe incluir un ámbito para indicar la interfaz como en los ejemplos que siguen. En IPv6, las llamadas individuales a send también pueden usar un ámbito explícito en las direcciones, por lo que solo los paquetes enviados a una dirección de multidifusión sin especificar un ámbito explícito se ven afectados por el uso exitoso más reciente de esta llamada.

Este método lanza EBADF si se llama en un socket no enlazado.

Ejemplo: interfaz de multidifusión saliente IPv6

En la mayoría de los sistemas, donde el formato de alcance usa el nombre de la interfaz:

js
const socket = dgram.createSocket('udp6')

socket.bind(1234, () => {
  socket.setMulticastInterface('::%eth1')
})

En Windows, donde el formato de alcance usa un número de interfaz:

js
const socket = dgram.createSocket('udp6')

socket.bind(1234, () => {
  socket.setMulticastInterface('::%2')
})

Ejemplo: interfaz de multidifusión saliente IPv4

Todos los sistemas usan una IP del host en la interfaz física deseada:

js
const socket = dgram.createSocket('udp4')

socket.bind(1234, () => {
  socket.setMulticastInterface('10.0.0.2')
})

Resultados de la llamada

Una llamada en un socket que no está listo para enviar o que ya no está abierto puede lanzar un error Not running Error.

Si multicastInterface no se puede analizar como una IP, se lanza un error de sistema EINVAL System Error.

En IPv4, si multicastInterface es una dirección válida pero no coincide con ninguna interfaz, o si la dirección no coincide con la familia, se lanza un System Error como EADDRNOTAVAIL o EPROTONOSUP.

En IPv6, la mayoría de los errores al especificar u omitir el alcance resultarán en que el socket continúe usando (o regrese a) la selección de interfaz predeterminada del sistema.

Se puede usar la dirección ANY de la familia de direcciones de un socket (IPv4 '0.0.0.0' o IPv6 '::') para devolver el control de la interfaz saliente predeterminada de los sockets al sistema para futuros paquetes de multidifusión.

socket.setMulticastLoopback(flag)

Añadido en: v0.3.8

Establece o borra la opción de socket IP_MULTICAST_LOOP. Cuando se establece en true, los paquetes multidifusión también se recibirán en la interfaz local.

Este método lanza EBADF si se llama en un socket no enlazado.

socket.setMulticastTTL(ttl)

Añadido en: v0.3.8

Establece la opción de socket IP_MULTICAST_TTL. Si bien TTL generalmente significa "Tiempo de vida", en este contexto especifica el número de saltos IP que un paquete puede recorrer, específicamente para el tráfico de multidifusión. Cada enrutador o puerta de enlace que reenvía un paquete decrementa el TTL. Si un enrutador decrementa el TTL a 0, no se reenviará.

El argumento ttl puede estar entre 0 y 255. El valor predeterminado en la mayoría de los sistemas es 1.

Este método lanza EBADF si se llama en un socket no enlazado.

socket.setRecvBufferSize(size)

Añadido en: v8.7.0

Establece la opción de socket SO_RCVBUF. Establece el tamaño máximo del búfer de recepción del socket en bytes.

Este método lanza ERR_SOCKET_BUFFER_SIZE si se llama en un socket no enlazado.

socket.setSendBufferSize(size)

Añadido en: v8.7.0

Establece la opción de socket SO_SNDBUF. Establece el tamaño máximo del búfer de envío del socket en bytes.

Este método lanza ERR_SOCKET_BUFFER_SIZE si se llama en un socket no enlazado.

socket.setTTL(ttl)

Añadido en: v0.1.101

Establece la opción de socket IP_TTL. Si bien TTL generalmente significa "Tiempo de vida", en este contexto especifica el número de saltos IP que se permite que un paquete recorra. Cada router o gateway que reenvía un paquete decrementa el TTL. Si un router decrementa el TTL a 0, no se reenviará. El cambio de valores TTL generalmente se realiza para sondeos de red o cuando se realiza multidifusión.

El argumento ttl puede estar entre 1 y 255. El valor predeterminado en la mayoría de los sistemas es 64.

Este método lanza EBADF si se llama en un socket no enlazado.

socket.unref()

Añadido en: v0.9.1

Por defecto, enlazar un socket hará que bloquee la salida del proceso Node.js mientras el socket esté abierto. El método socket.unref() se puede usar para excluir el socket del conteo de referencias que mantiene activo el proceso Node.js, permitiendo que el proceso salga incluso si el socket sigue escuchando.

Llamar a socket.unref() múltiples veces no tendrá ningún efecto adicional.

El método socket.unref() devuelve una referencia al socket para que las llamadas puedan encadenarse.

Funciones del módulo node:dgram

dgram.createSocket(options[, callback])

[Historial]

VersiónCambios
v23.1.0Se admite la opción reusePort.
v15.8.0Se agregó compatibilidad con AbortSignal.
v11.4.0Se admite la opción ipv6Only.
v8.7.0Ahora se admiten las opciones recvBufferSize y sendBufferSize.
v8.6.0Se admite la opción lookup.
v0.11.13Añadido en: v0.11.13
  • options <Object> Las opciones disponibles son:

    • type <string> La familia del socket. Debe ser 'udp4' o 'udp6'. Requerido.
    • reuseAddr <boolean> Cuando es true, socket.bind() reutilizará la dirección, incluso si otro proceso ya ha enlazado un socket en ella, pero solo un socket puede recibir los datos. Predeterminado: false.
    • reusePort <boolean> Cuando es true, socket.bind() reutilizará el puerto, incluso si otro proceso ya ha enlazado un socket en él. Los datagramas entrantes se distribuyen a los sockets que escuchan. La opción solo está disponible en algunas plataformas, como Linux 3.9+, DragonFlyBSD 3.6+, FreeBSD 12.0+, Solaris 11.4 y AIX 7.2.5+. En plataformas no compatibles, esta opción genera un error cuando se enlaza el socket. Predeterminado: false.
    • ipv6Only <boolean> Configurar ipv6Only en true deshabilitará la compatibilidad con doble pila, es decir, enlazar a la dirección :: no hará que se enlace 0.0.0.0. Predeterminado: false.
    • recvBufferSize <number> Establece el valor del socket SO_RCVBUF.
    • sendBufferSize <number> Establece el valor del socket SO_SNDBUF.
    • lookup <Function> Función de búsqueda personalizada. Predeterminado: dns.lookup().
    • signal <AbortSignal> Una señal AbortSignal que puede utilizarse para cerrar un socket.
    • receiveBlockList <net.BlockList> receiveBlockList puede utilizarse para descartar datagramas entrantes a direcciones IP, rangos de IP o subredes IP específicas. Esto no funciona si el servidor está detrás de un proxy inverso, NAT, etc., porque la dirección que se comprueba con la lista de bloqueo es la dirección del proxy o la especificada por el NAT.
    • sendBlockList <net.BlockList> sendBlockList puede utilizarse para deshabilitar el acceso saliente a direcciones IP, rangos de IP o subredes IP específicas.
  • callback <Function> Adjuntado como un oyente para eventos 'message'. Opcional.

  • Devuelve: <dgram.Socket>

Crea un objeto dgram.Socket. Una vez creado el socket, llamar a socket.bind() indicará al socket que empiece a escuchar mensajes de datagramas. Cuando no se pasan address y port a socket.bind(), el método enlazará el socket a la dirección "todas las interfaces" en un puerto aleatorio (hace lo correcto para sockets udp4 y udp6). La dirección y el puerto enlazados se pueden recuperar usando socket.address().address y socket.address().port.

Si la opción signal está habilitada, llamar a .abort() en el AbortController correspondiente es similar a llamar a .close() en el socket:

js
const controller = new AbortController()
const { signal } = controller
const server = dgram.createSocket({ type: 'udp4', signal })
server.on('message', (msg, rinfo) => {
  console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`)
})
// Más tarde, cuando quieras cerrar el servidor.
controller.abort()

dgram.createSocket(type[, callback])

Añadido en: v0.1.99

Crea un objeto dgram.Socket del tipo especificado.

Una vez creado el socket, llamar a socket.bind() instruirá al socket a comenzar a escuchar mensajes de datagrama. Cuando address y port no se pasan a socket.bind(), el método enlazará el socket a la dirección "todas las interfaces" en un puerto aleatorio (hace lo correcto para sockets udp4 y udp6). La dirección y el puerto enlazados se pueden recuperar usando socket.address().address y socket.address().port.