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.
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
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
- Extiende: <EventEmitter>
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
exception
<Error>
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ón | Cambios |
---|---|
v18.4.0 | La propiedad family ahora devuelve una cadena en lugar de un número. |
v18.0.0 | La propiedad family ahora devuelve un número en lugar de una cadena. |
v0.1.99 | Añ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
.
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
:
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')
})
}
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: <Object>
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ón | Cambios |
---|---|
v0.9.1 | El 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.99 | Añadido en: v0.1.99 |
port
<integer>address
<string>callback
<Function> sin parámetros. Se llama cuando el enlace se completa.
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:
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
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
options
<Object> Requerido. Soporta las siguientes propiedades:callback
<Function>
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.
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
port
<integer>address
<string>callback
<Function> Llamado cuando la conexión se completa o en caso de error.
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
- Devuelve: <dgram.Socket>
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: <Object>
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ón | Cambios |
---|---|
v17.0.0 | El parámetro address ahora solo acepta una string , null o undefined . |
v14.5.0, v12.19.0 | El parámetro msg ahora puede ser cualquier TypedArray o DataView . |
v12.0.0 | Añadida la compatibilidad para enviar datos en sockets conectados. |
v8.0.0 | El parámetro msg ahora puede ser un Uint8Array . |
v8.0.0 | El parámetro address ahora es siempre opcional. |
v6.0.0 | En caso de éxito, callback ahora se llamará con un argumento error de null en lugar de 0 . |
v5.7.0 | El parámetro msg ahora puede ser un array. Además, los parámetros offset y length ahora son opcionales. |
v0.1.99 | Añadido en: v0.1.99 |
msg
<Buffer> | <TypedArray> | <DataView> | <string> | <Array> Mensaje a ser enviado.offset
<integer> Desplazamiento en el buffer donde comienza el mensaje.length
<integer> Número de bytes en el mensaje.port
<integer> Puerto de destino.address
<string> Nombre de host o dirección IP de destino.callback
<Function> Llamado cuando el mensaje ha sido enviado.
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
;
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()
})
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
;
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()
})
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
:
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()
})
})
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 unaMTU
mínima de 68 octetos, mientras que laMTU
recomendada para IPv4 es 576 (típicamente recomendada comoMTU
para aplicaciones de tipo dial-up), ya sea que lleguen completas o fragmentadas. Para IPv6, laMTU
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 unaMTU
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
flag
<boolean>
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
multicastInterface
<string>
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:
const socket = dgram.createSocket('udp6')
socket.bind(1234, () => {
socket.setMulticastInterface('::%eth1')
})
En Windows, donde el formato de alcance usa un número de interfaz:
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:
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
flag
<boolean>
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
ttl
<integer>
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
size
<integer>
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
size
<integer>
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
ttl
<integer>
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
- Devuelve: <dgram.Socket>
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ón | Cambios |
---|---|
v23.1.0 | Se admite la opción reusePort . |
v15.8.0 | Se agregó compatibilidad con AbortSignal. |
v11.4.0 | Se admite la opción ipv6Only . |
v8.7.0 | Ahora se admiten las opciones recvBufferSize y sendBufferSize . |
v8.6.0 | Se admite la opción lookup . |
v0.11.13 | Añ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 estrue
,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 estrue
,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> Configuraripv6Only
entrue
deshabilitará la compatibilidad con doble pila, es decir, enlazar a la dirección::
no hará que se enlace0.0.0.0
. Predeterminado:false
.recvBufferSize
<number> Establece el valor del socketSO_RCVBUF
.sendBufferSize
<number> Establece el valor del socketSO_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:
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
type
<string>'udp4'
o'udp6'
.callback
<Function> Adjuntado como un escuchador a eventos'message'
.- Devuelve: <dgram.Socket>
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
.