Sockets UDP/datagrama
[Estável: 2 - Estável]
Estável: 2 Estabilidade: 2 - Estável
Código Fonte: lib/dgram.js
O módulo node:dgram fornece uma implementação de sockets de datagrama UDP.
import dgram from 'node:dgram';
const server = dgram.createSocket('udp4');
server.on('error', (err) => {
console.error(`erro do servidor:\n${err.stack}`);
server.close();
});
server.on('message', (msg, rinfo) => {
console.log(`servidor recebeu: ${msg} de ${rinfo.address}:${rinfo.port}`);
});
server.on('listening', () => {
const address = server.address();
console.log(`servidor ouvindo ${address.address}:${address.port}`);
});
server.bind(41234);
// Imprime: servidor ouvindo 0.0.0.0:41234const dgram = require('node:dgram');
const server = dgram.createSocket('udp4');
server.on('error', (err) => {
console.error(`erro do servidor:\n${err.stack}`);
server.close();
});
server.on('message', (msg, rinfo) => {
console.log(`servidor recebeu: ${msg} de ${rinfo.address}:${rinfo.port}`);
});
server.on('listening', () => {
const address = server.address();
console.log(`servidor ouvindo ${address.address}:${address.port}`);
});
server.bind(41234);
// Imprime: servidor ouvindo 0.0.0.0:41234Classe: dgram.Socket
Adicionado em: v0.1.99
- Estende: <EventEmitter>
Encapsula a funcionalidade de datagrama.
Novas instâncias de dgram.Socket são criadas usando dgram.createSocket(). A palavra-chave new não deve ser usada para criar instâncias de dgram.Socket.
Evento: 'close'
Adicionado em: v0.1.99
O evento 'close' é emitido depois que um socket é fechado com close(). Uma vez acionado, nenhum novo evento 'message' será emitido neste socket.
Evento: 'connect'
Adicionado em: v12.0.0
O evento 'connect' é emitido depois que um socket é associado a um endereço remoto como resultado de uma chamada connect() bem-sucedida.
Evento: 'error'
Adicionado em: v0.1.99
exception<Error>
O evento 'error' é emitido sempre que ocorre um erro. A função de tratamento do evento recebe um único objeto Error.
Evento: 'listening'
Adicionado em: v0.1.99
O evento 'listening' é emitido quando o dgram.Socket é endereçável e pode receber dados. Isso acontece explicitamente com socket.bind() ou implicitamente na primeira vez que os dados são enviados usando socket.send(). Até que o dgram.Socket esteja ouvindo, os recursos do sistema subjacente não existem e chamadas como socket.address() e socket.setTTL() falharão.
Evento: 'message'
[Histórico]
| Versão | Mudanças |
|---|---|
| v18.4.0 | A propriedade family agora retorna uma string em vez de um número. |
| v18.0.0 | A propriedade family agora retorna um número em vez de uma string. |
| v0.1.99 | Adicionado em: v0.1.99 |
O evento 'message' é emitido quando um novo datagrama está disponível em um socket. A função de tratamento do evento recebe dois argumentos: msg e rinfo.
Se o endereço de origem do pacote de entrada for um endereço link-local IPv6, o nome da interface será adicionado ao address. Por exemplo, um pacote recebido na interface en0 pode ter o campo de endereço definido como 'fe80::2618:1234:ab11:3b9c%en0', onde '%en0' é o nome da interface como um sufixo de ID de zona.
socket.addMembership(multicastAddress[, multicastInterface])
Adicionado em: v0.6.9
Informa o kernel para se juntar a um grupo multicast no multicastAddress e multicastInterface fornecidos, usando a opção de socket IP_ADD_MEMBERSHIP. Se o argumento multicastInterface não for especificado, o sistema operacional escolherá uma interface e adicionará a participação a ela. Para adicionar participação a todas as interfaces disponíveis, chame addMembership várias vezes, uma vez por interface.
Quando chamado em um socket não vinculado, este método se vinculará implicitamente a uma porta aleatória, escutando em todas as interfaces.
Ao compartilhar um socket UDP entre múltiplos workers do cluster, a função socket.addMembership() deve ser chamada apenas uma vez, caso contrário, ocorrerá um erro EADDRINUSE:
import cluster from 'node:cluster';
import dgram from 'node:dgram';
if (cluster.isPrimary) {
cluster.fork(); // Funciona bem.
cluster.fork(); // Falha com 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 bem.
cluster.fork(); // Falha com EADDRINUSE.
} else {
const s = dgram.createSocket('udp4');
s.bind(1234, () => {
s.addMembership('224.0.0.114');
});
}socket.addSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])
Adicionado em: v13.1.0, v12.16.0
Informa o kernel para se juntar a um canal multicast específico da fonte no sourceAddress e groupAddress fornecidos, usando a multicastInterface com a opção de socket IP_ADD_SOURCE_MEMBERSHIP. Se o argumento multicastInterface não for especificado, o sistema operacional escolherá uma interface e adicionará a participação a ela. Para adicionar participação a todas as interfaces disponíveis, chame socket.addSourceSpecificMembership() várias vezes, uma vez por interface.
Quando chamado em um socket não vinculado, este método se vinculará implicitamente a uma porta aleatória, escutando em todas as interfaces.
socket.address()
Adicionado em: v0.1.99
- Retorna: <Object>
Retorna um objeto contendo as informações de endereço para um socket. Para sockets UDP, este objeto conterá as propriedades address, family e port.
Este método lança EBADF se chamado em um socket não vinculado.
socket.bind([port][, address][, callback])
[Histórico]
| Versão | Mudanças |
|---|---|
| v0.9.1 | O método foi alterado para um modelo de execução assíncrono. O código legado precisaria ser alterado para passar uma função de callback para a chamada do método. |
| v0.1.99 | Adicionado em: v0.1.99 |
port<integer>address<string>callback<Function> sem parâmetros. Chamado quando a vinculação é concluída.
Para sockets UDP, faz com que o dgram.Socket escute mensagens de datagrama em uma port nomeada e address opcional. Se port não for especificado ou for 0, o sistema operacional tentará vincular a uma porta aleatória. Se address não for especificado, o sistema operacional tentará escutar em todos os endereços. Uma vez que a vinculação é concluída, um evento 'listening' é emitido e a função callback opcional é chamada.
Especificar um listener de evento 'listening' e passar um callback para o método socket.bind() não é prejudicial, mas não é muito útil.
Um socket de datagrama vinculado mantém o processo Node.js em execução para receber mensagens de datagrama.
Se a vinculação falhar, um evento 'error' é gerado. Em casos raros (por exemplo, tentar vincular com um socket fechado), um Error pode ser lançado.
Exemplo de um servidor UDP escutando na porta 41234:
import dgram from 'node:dgram';
const server = dgram.createSocket('udp4');
server.on('error', (err) => {
console.error(`server error:\n${err.stack}`);
server.close();
});
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
server.on('listening', () => {
const address = server.address();
console.log(`server listening ${address.address}:${address.port}`);
});
server.bind(41234);
// Prints: server listening 0.0.0.0:41234const dgram = require('node:dgram');
const server = dgram.createSocket('udp4');
server.on('error', (err) => {
console.error(`server error:\n${err.stack}`);
server.close();
});
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
server.on('listening', () => {
const address = server.address();
console.log(`server listening ${address.address}:${address.port}`);
});
server.bind(41234);
// Prints: server listening 0.0.0.0:41234socket.bind(options[, callback])
Adicionado em: v0.11.14
options<Object> Obrigatório. Suporta as seguintes propriedades:callback<Function>
Para sockets UDP, faz com que o dgram.Socket espere por mensagens de datagrama em uma port nomeada e address opcional que são passados como propriedades de um objeto options passado como o primeiro argumento. Se port não for especificado ou for 0, o sistema operacional tentará vincular a uma porta aleatória. Se address não for especificado, o sistema operacional tentará escutar em todos os endereços. Uma vez que a vinculação esteja completa, um evento 'listening' é emitido e a função callback opcional é chamada.
O objeto options pode conter uma propriedade fd. Quando um fd maior que 0 é definido, ele envolverá um socket existente com o descritor de arquivo fornecido. Neste caso, as propriedades de port e address serão ignoradas.
Especificar um listener de evento 'listening' e passar um callback para o método socket.bind() não é prejudicial, mas não é muito útil.
O objeto options pode conter uma propriedade exclusive adicional que é usada ao usar objetos dgram.Socket com o módulo cluster. Quando exclusive é definido como false (o padrão), os workers do cluster usarão o mesmo handle de socket subjacente, permitindo que as tarefas de manipulação de conexão sejam compartilhadas. Quando exclusive é true, no entanto, o handle não é compartilhado e a tentativa de compartilhamento de porta resulta em um erro. Criar um dgram.Socket com a opção reusePort definida como true faz com que exclusive seja sempre true quando socket.bind() é chamado.
Um socket de datagrama vinculado mantém o processo Node.js em execução para receber mensagens de datagrama.
Se a vinculação falhar, um evento 'error' é gerado. Em casos raros (por exemplo, tentar vincular com um socket fechado), um Error pode ser lançado.
Um exemplo de socket ouvindo em uma porta exclusiva é mostrado abaixo.
socket.bind({
address: 'localhost',
port: 8000,
exclusive: true,
});socket.close([callback])
Adicionado em: v0.1.99
callback<Function> Chamado quando o socket foi fechado.
Fecha o socket subjacente e para de escutar por dados nele. Se um callback for fornecido, ele é adicionado como um listener para o evento 'close'.
socket[Symbol.asyncDispose]()
Adicionado em: v20.5.0, v18.18.0
[Estável: 1 - Experimental]
Estável: 1 Estabilidade: 1 - Experimental
Chama socket.close() e retorna uma promise que é cumprida quando o socket é fechado.
socket.connect(port[, address][, callback])
Adicionado em: v12.0.0
port<integer>address<string>callback<Function> Chamado quando a conexão é completada ou em caso de erro.
Associa o dgram.Socket a um endereço e porta remotos. Cada mensagem enviada por este handle é automaticamente enviada para esse destino. Além disso, o socket receberá apenas mensagens desse peer remoto. Tentar chamar connect() em um socket já conectado resultará em uma exceção ERR_SOCKET_DGRAM_IS_CONNECTED. Se address não for fornecido, '127.0.0.1' (para sockets udp4) ou '::1' (para sockets udp6) serão usados por padrão. Assim que a conexão for concluída, um evento 'connect' é emitido e a função callback opcional é chamada. Em caso de falha, o callback é chamado ou, falhando isso, um evento 'error' é emitido.
socket.disconnect()
Adicionado em: v12.0.0
Uma função síncrona que dissocia um dgram.Socket conectado de seu endereço remoto. Tentar chamar disconnect() em um socket não vinculado ou já desconectado resultará em uma exceção ERR_SOCKET_DGRAM_NOT_CONNECTED.
socket.dropMembership(multicastAddress[, multicastInterface])
Adicionado em: v0.6.9
Instrui o kernel a sair de um grupo multicast em multicastAddress usando a opção de socket IP_DROP_MEMBERSHIP. Este método é chamado automaticamente pelo kernel quando o socket é fechado ou o processo termina, então a maioria dos aplicativos nunca terá motivos para chamar isso.
Se multicastInterface não for especificado, o sistema operacional tentará remover a associação em todas as interfaces válidas.
socket.dropSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])
Adicionado em: v13.1.0, v12.16.0
Instrui o kernel a sair de um canal multicast específico da fonte em sourceAddress e groupAddress usando a opção de socket IP_DROP_SOURCE_MEMBERSHIP. Este método é chamado automaticamente pelo kernel quando o socket é fechado ou o processo termina, então a maioria dos aplicativos nunca terá motivos para chamar isso.
Se multicastInterface não for especificado, o sistema operacional tentará remover a associação em todas as interfaces válidas.
socket.getRecvBufferSize()
Adicionado em: v8.7.0
- Retorna: <number> o tamanho do buffer de recebimento do socket
SO_RCVBUFem bytes.
Este método lança ERR_SOCKET_BUFFER_SIZE se chamado em um socket não vinculado.
socket.getSendBufferSize()
Adicionado em: v8.7.0
- Retorna: <number> o tamanho do buffer de envio do socket
SO_SNDBUFem bytes.
Este método lança ERR_SOCKET_BUFFER_SIZE se chamado em um socket não vinculado.
socket.getSendQueueSize()
Adicionado em: v18.8.0, v16.19.0
- Retorna: <number> Número de bytes enfileirados para envio.
socket.getSendQueueCount()
Adicionado em: v18.8.0, v16.19.0
- Retorna: <number> Número de solicitações de envio atualmente na fila aguardando para serem processadas.
socket.ref()
Adicionado em: v0.9.1
- Retorna: <dgram.Socket>
Por padrão, vincular um socket fará com que ele impeça o processo Node.js de sair enquanto o socket estiver aberto. O método socket.unref() pode ser usado para excluir o socket da contagem de referência que mantém o processo Node.js ativo. O método socket.ref() adiciona o socket de volta à contagem de referência e restaura o comportamento padrão.
Chamar socket.ref() várias vezes não terá efeito adicional.
O método socket.ref() retorna uma referência ao socket para que as chamadas possam ser encadeadas.
socket.remoteAddress()
Adicionado em: v12.0.0
- Retorna: <Object>
Retorna um objeto contendo o address, family e port do endpoint remoto. Este método lança uma exceção ERR_SOCKET_DGRAM_NOT_CONNECTED se o socket não estiver conectado.
socket.send(msg[, offset, length][, port][, address][, callback])
[Histórico]
| Versão | Mudanças |
|---|---|
| v17.0.0 | O parâmetro address agora aceita apenas uma string, null ou undefined. |
| v14.5.0, v12.19.0 | O parâmetro msg agora pode ser qualquer TypedArray ou DataView. |
| v12.0.0 | Adicionado suporte para envio de dados em sockets conectados. |
| v8.0.0 | O parâmetro msg agora pode ser um Uint8Array. |
| v8.0.0 | O parâmetro address agora é sempre opcional. |
| v6.0.0 | Em caso de sucesso, o callback agora será chamado com um argumento error de null em vez de 0. |
| v5.7.0 | O parâmetro msg agora pode ser um array. Além disso, os parâmetros offset e length agora são opcionais. |
| v0.1.99 | Adicionado em: v0.1.99 |
msg<Buffer> | <TypedArray> | <DataView> | <string> | <Array> Mensagem a ser enviada.offset<integer> Deslocamento no buffer onde a mensagem começa.length<integer> Número de bytes na mensagem.port<integer> Porta de destino.address<string> Nome do host de destino ou endereço IP.callback<Function> Chamado quando a mensagem for enviada.
Transmite um datagrama no socket. Para sockets sem conexão, a port e o address de destino devem ser especificados. Sockets conectados, por outro lado, usarão seu endpoint remoto associado, então os argumentos port e address não devem ser definidos.
O argumento msg contém a mensagem a ser enviada. Dependendo do seu tipo, diferentes comportamentos podem ser aplicados. Se msg for um Buffer, qualquer TypedArray ou um DataView, o offset e length especificam o deslocamento dentro do Buffer onde a mensagem começa e o número de bytes na mensagem, respectivamente. Se msg for uma String, então ela é automaticamente convertida para um Buffer com codificação 'utf8'. Com mensagens que contêm caracteres multi-byte, offset e length serão calculados em relação ao comprimento em bytes e não à posição do caractere. Se msg for um array, offset e length não devem ser especificados.
O argumento address é uma string. Se o valor de address for um nome de host, o DNS será usado para resolver o endereço do host. Se address não for fornecido ou for nulo, '127.0.0.1' (para sockets udp4) ou '::1' (para sockets udp6) serão usados por padrão.
Se o socket não tiver sido previamente vinculado com uma chamada para bind, o socket é atribuído a um número de porta aleatório e é vinculado ao endereço "todas as interfaces" ('0.0.0.0' para sockets udp4, '::0' para sockets udp6.)
Uma função callback opcional pode ser especificada como uma forma de relatar erros de DNS ou para determinar quando é seguro reutilizar o objeto buf. As pesquisas de DNS atrasam o tempo para enviar por pelo menos um ciclo do loop de eventos do Node.js.
A única maneira de saber com certeza que o datagrama foi enviado é usando um callback. Se ocorrer um erro e um callback for fornecido, o erro será passado como o primeiro argumento para o callback. Se um callback não for fornecido, o erro é emitido como um evento 'error' no objeto socket.
Offset e length são opcionais, mas ambos devem ser definidos se algum deles for usado. Eles são suportados apenas quando o primeiro argumento é um Buffer, um TypedArray ou um DataView.
Este método lança ERR_SOCKET_BAD_PORT se for chamado em um socket não vinculado.
Exemplo de envio de um pacote UDP para uma porta em localhost;
import dgram from 'node:dgram';
import { Buffer } from 'node:buffer';
const message = Buffer.from('Some 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('Some bytes');
const client = dgram.createSocket('udp4');
client.send(message, 41234, 'localhost', (err) => {
client.close();
});Exemplo de envio de um pacote UDP composto por múltiplos buffers para uma porta em 127.0.0.1;
import dgram from 'node:dgram';
import { Buffer } from 'node:buffer';
const buf1 = Buffer.from('Some ');
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('Some ');
const buf2 = Buffer.from('bytes');
const client = dgram.createSocket('udp4');
client.send([buf1, buf2], 41234, (err) => {
client.close();
});Enviar múltiplos buffers pode ser mais rápido ou mais lento dependendo da aplicação e do sistema operacional. Execute benchmarks para determinar a estratégia ideal caso a caso. Geralmente falando, no entanto, enviar múltiplos buffers é mais rápido.
Exemplo de envio de um pacote UDP usando um socket conectado a uma porta em localhost:
import dgram from 'node:dgram';
import { Buffer } from 'node:buffer';
const message = Buffer.from('Some 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('Some bytes');
const client = dgram.createSocket('udp4');
client.connect(41234, 'localhost', (err) => {
client.send(message, (err) => {
client.close();
});
});Observação sobre o tamanho do datagrama UDP
O tamanho máximo de um datagrama IPv4/v6 depende da MTU (Maximum Transmission Unit - Unidade Máxima de Transmissão) e do tamanho do campo Payload Length (Comprimento da Carga Útil).
- O campo
Payload Lengthtem 16 bits de largura, o que significa que uma carga útil normal não pode exceder 64K octetos, incluindo o cabeçalho da internet e os dados (65.507 bytes = 65.535 - 8 bytes do cabeçalho UDP - 20 bytes do cabeçalho IP); isso geralmente é verdade para interfaces de loopback, mas essas mensagens de datagramas longos são impraticáveis para a maioria dos hosts e redes. - A
MTUé o maior tamanho que uma determinada tecnologia de camada de link pode suportar para mensagens de datagrama. Para qualquer link, o IPv4 exige umaMTUmínima de 68 octetos, enquanto aMTUrecomendada para IPv4 é 576 (normalmente recomendada como aMTUpara aplicativos do tipo dial-up), quer cheguem inteiros ou em fragmentos. Para IPv6, aMTUmínima é de 1280 octetos. No entanto, o tamanho mínimo obrigatório do buffer de remontagem de fragmentos é de 1500 octetos. O valor de 68 octetos é muito pequeno, pois a maioria das tecnologias de camada de link atuais, como Ethernet, têm umaMTUmínima de 1500.
É impossível saber com antecedência a MTU de cada link pelo qual um pacote pode viajar. Enviar um datagrama maior que a MTU do receptor não funcionará porque o pacote será descartado silenciosamente, sem informar à origem que os dados não chegaram ao destinatário pretendido.
socket.setBroadcast(flag)
Adicionado em: v0.6.9
flag<boolean>
Define ou limpa a opção de socket SO_BROADCAST. Quando definido como true, os pacotes UDP podem ser enviados para o endereço de broadcast de uma interface local.
Este método lança EBADF se for chamado em um socket não vinculado.
socket.setMulticastInterface(multicastInterface)
Adicionado em: v8.6.0
multicastInterface<string>
Todas as referências ao escopo nesta seção referem-se aos Índices de Zona IPv6, que são definidos por RFC 4007. Em formato de string, um IP com um índice de escopo é escrito como 'IP%scope' onde escopo é um nome de interface ou número de interface.
Define a interface multicast de saída padrão do socket para uma interface escolhida ou de volta para a seleção de interface do sistema. O multicastInterface deve ser uma representação de string válida de um IP da família do socket.
Para sockets IPv4, este deve ser o IP configurado para a interface física desejada. Todos os pacotes enviados para multicast no socket serão enviados na interface determinada pelo uso bem-sucedido mais recente desta chamada.
Para sockets IPv6, multicastInterface deve incluir um escopo para indicar a interface, como nos exemplos a seguir. No IPv6, chamadas send individuais também podem usar escopo explícito em endereços, portanto, apenas os pacotes enviados para um endereço multicast sem especificar um escopo explícito são afetados pelo uso bem-sucedido mais recente desta chamada.
Este método lança EBADF se for chamado em um socket não vinculado.
Exemplo: Interface multicast de saída IPv6
Na maioria dos sistemas, onde o formato de escopo usa o nome da interface:
const socket = dgram.createSocket('udp6');
socket.bind(1234, () => {
socket.setMulticastInterface('::%eth1');
});No Windows, onde o formato de escopo usa um número de interface:
const socket = dgram.createSocket('udp6');
socket.bind(1234, () => {
socket.setMulticastInterface('::%2');
});Exemplo: Interface multicast de saída IPv4
Todos os sistemas usam um IP do host na interface física desejada:
const socket = dgram.createSocket('udp4');
socket.bind(1234, () => {
socket.setMulticastInterface('10.0.0.2');
});Resultados da chamada
Uma chamada em um socket que não está pronto para enviar ou não está mais aberto pode lançar um Error Not running ([/api/errors#class-error]).
Se multicastInterface não puder ser analisado em um IP, um System Error EINVAL ([/api/errors#class-systemerror]) é lançado.
Em IPv4, se multicastInterface for um endereço válido, mas não corresponder a nenhuma interface, ou se o endereço não corresponder à família, um System Error ([/api/errors#class-systemerror]) como EADDRNOTAVAIL ou EPROTONOSUP será lançado.
Em IPv6, a maioria dos erros ao especificar ou omitir o escopo resultará no socket continuando a usar (ou retornando a) a seleção de interface padrão do sistema.
O endereço ANY da família de endereços de um socket (IPv4 '0.0.0.0' ou IPv6 '::') pode ser usado para retornar o controle da interface de saída padrão dos sockets ao sistema para futuros pacotes multicast.
socket.setMulticastLoopback(flag)
Adicionado em: v0.3.8
flag<boolean>
Define ou limpa a opção de socket IP_MULTICAST_LOOP. Quando definido como true, os pacotes multicast também serão recebidos na interface local.
Este método lança EBADF se chamado em um socket não vinculado.
socket.setMulticastTTL(ttl)
Adicionado em: v0.3.8
ttl<integer>
Define a opção de socket IP_MULTICAST_TTL. Embora TTL geralmente signifique "Time to Live" (tempo de vida), neste contexto, ele especifica o número de saltos IP que um pacote tem permissão para percorrer, especificamente para tráfego multicast. Cada roteador ou gateway que encaminha um pacote decrementa o TTL. Se o TTL for decrementado para 0 por um roteador, ele não será encaminhado.
O argumento ttl pode estar entre 0 e 255. O padrão na maioria dos sistemas é 1.
Este método lança EBADF se chamado em um socket não vinculado.
socket.setRecvBufferSize(size)
Adicionado em: v8.7.0
size<integer>
Define a opção de socket SO_RCVBUF. Define o buffer de recebimento máximo do socket em bytes.
Este método lança ERR_SOCKET_BUFFER_SIZE se for chamado em um socket não vinculado.
socket.setSendBufferSize(size)
Adicionado em: v8.7.0
size<integer>
Define a opção de socket SO_SNDBUF. Define o buffer de envio máximo do socket em bytes.
Este método lança ERR_SOCKET_BUFFER_SIZE se for chamado em um socket não vinculado.
socket.setTTL(ttl)
Adicionado em: v0.1.101
ttl<integer>
Define a opção de socket IP_TTL. Embora TTL geralmente signifique "Time to Live" (Tempo de Vida), neste contexto, ele especifica o número de saltos IP que um pacote tem permissão para percorrer. Cada roteador ou gateway que encaminha um pacote decrementa o TTL. Se o TTL for decrementado para 0 por um roteador, ele não será encaminhado. A alteração dos valores de TTL é normalmente feita para sondagens de rede ou durante a multicastagem.
O argumento ttl pode estar entre 1 e 255. O padrão na maioria dos sistemas é 64.
Este método lança EBADF se for chamado em um socket não vinculado.
socket.unref()
Adicionado em: v0.9.1
- Retorna: <dgram.Socket>
Por padrão, vincular um socket fará com que ele impeça o processo do Node.js de sair enquanto o socket estiver aberto. O método socket.unref() pode ser usado para excluir o socket da contagem de referência que mantém o processo do Node.js ativo, permitindo que o processo saia mesmo que o socket ainda esteja escutando.
Chamar socket.unref() várias vezes não terá nenhum efeito adicional.
O método socket.unref() retorna uma referência ao socket para que as chamadas possam ser encadeadas.
Funções do módulo node:dgram
dgram.createSocket(options[, callback])
[Histórico]
| Versão | Mudanças |
|---|---|
| v23.1.0 | A opção reusePort é suportada. |
| v15.8.0 | Suporte para AbortSignal foi adicionado. |
| v11.4.0 | A opção ipv6Only é suportada. |
| v8.7.0 | As opções recvBufferSize e sendBufferSize são suportadas agora. |
| v8.6.0 | A opção lookup é suportada. |
| v0.11.13 | Adicionado em: v0.11.13 |
options<Objeto> As opções disponíveis são:type<string> A família do socket. Deve ser'udp4'ou'udp6'. Obrigatório.reuseAddr<boolean> Quandotruesocket.bind()reutilizará o endereço, mesmo que outro processo já tenha vinculado um socket a ele, mas apenas um socket pode receber os dados. Padrão:false.reusePort<boolean> Quandotruesocket.bind()reutilizará a porta, mesmo que outro processo já tenha vinculado um socket a ela. Datagramas de entrada são distribuídos para sockets de escuta. A opção está disponível apenas em algumas plataformas, como Linux 3.9+, DragonFlyBSD 3.6+, FreeBSD 12.0+, Solaris 11.4 e AIX 7.2.5+. Em plataformas não suportadas, esta opção levanta um erro quando o socket é vinculado. Padrão:false.ipv6Only<boolean> Definiripv6Onlyparatruedesativará o suporte a pilha dupla, ou seja, vincular ao endereço::não fará com que0.0.0.0seja vinculado. Padrão:false.recvBufferSize<number> Define o valor do socketSO_RCVBUF.sendBufferSize<number> Define o valor do socketSO_SNDBUF.lookup<Function> Função de pesquisa personalizada. Padrão:dns.lookup().signal<AbortSignal> Um AbortSignal que pode ser usado para fechar um socket.receiveBlockList<net.BlockList>receiveBlockListpode ser usado para descartar datagramas de entrada para endereços IP específicos, intervalos de IP ou sub-redes IP. Isso não funciona se o servidor estiver atrás de um proxy reverso, NAT, etc., porque o endereço verificado em relação à lista de bloqueio é o endereço do proxy ou o especificado pelo NAT.sendBlockList<net.BlockList>sendBlockListpode ser usado para desabilitar o acesso de saída a endereços IP específicos, intervalos de IP ou sub-redes IP.
callback<Function> Anexado como um listener para eventos'message'. Opcional.Retorna: <dgram.Socket>
Cria um objeto dgram.Socket. Uma vez que o socket é criado, chamar socket.bind() instruirá o socket a começar a ouvir mensagens de datagrama. Quando address e port não são passados para socket.bind(), o método vinculará o socket ao endereço "todas as interfaces" em uma porta aleatória (ele faz a coisa certa tanto para sockets udp4 quanto udp6). O endereço e a porta vinculados podem ser recuperados usando socket.address().address e socket.address().port.
Se a opção signal estiver habilitada, chamar .abort() no AbortController correspondente é semelhante a chamar .close() no 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}`);
});
// Later, when you want to close the server.
controller.abort();dgram.createSocket(type[, callback])
Adicionado em: v0.1.99
type<string> Tanto'udp4'quanto'udp6'.callback<Function> Anexada como um ouvinte aos eventos'message'.- Retorna: <dgram.Socket>
Cria um objeto dgram.Socket do type especificado.
Uma vez que o socket é criado, chamar socket.bind() irá instruir o socket a começar a ouvir mensagens de datagrama. Quando address e port não são passados para socket.bind(), o método irá vincular o socket ao endereço de "todas as interfaces" em uma porta aleatória (ele faz a coisa certa para sockets udp4 e udp6). O endereço e a porta vinculados podem ser recuperados usando socket.address().address e socket.address().port.