Spec-Zone.ru › Node.js 16 LTS

UDP/дейтаграммные сокеты

Устойчивость: 2 - Стабильно

Исходный код: lib/dgram.js

Модуль dgram предоставляет реализацию UDP-дейтаграммных сокетов.

МОДУЛИ MJS

import dgram from 'dgram';

const server = dgram.createSocket('udp4');

server.on('error', (err) => {
  console.log(`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:41234

МОДУЛИ CJS

const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('error', (err) => {
  console.log(`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:41234

Класс: dgram.Socket

Добавлена в: v0.1.99
  • Расширяет: <EventEmitter>

Оборачивает функциональность датаграмм.

Новые экземпляры dgram.Socket создаются с помощью dgram.createSocket(). Ключевое слово new не следует использовать для создания экземпляров dgram.Socket.

Событие: 'close'

Добавлена в: v0.1.99

Событие 'close' генерируется после закрытия сокета с помощью close(). После срабатывания новые события 'message' на этом сокете больше не будут генерироваться.

Событие: 'connect'

Добавлена в: v12.0.0

Событие 'connect' генерируется после ассоциации сокета с удаленным адресом в результате успешного вызова connect().

Событие: 'error'

Добавлена в: v0.1.99
  • exception <Ошибка>

Событие 'error' генерируется всякий раз, когда возникает ошибка. Функция обработчика события получает один аргумент — объект Error.

Событие: 'listening'

Добавлена в: v0.1.99

Событие 'listening' генерируется после того, как сокет dgram.Socket становится доступным для приема данных. Это происходит либо явно с помощью socket.bind(), либо неявно при первом отправлении данных с помощью socket.send(). До тех пор, пока сокет dgram.Socket не находится в состоянии прослушивания, подлежащие ресурсы системы отсутствуют, и такие вызовы, как socket.address() и socket.setTTL(), будут неудачными.

Событие: 'message'

Добавлена в: v0.1.99

Событие 'message' генерируется, когда новый датаграмма доступен на сокете. Функция обработчика события получает два аргумента: msg и rinfo.

  • msg <Буфер> Сообщение.
  • rinfo <Объект> Информация об удаленном адресе.
    • address <строка> Адрес отправителя.
    • family <строка> Семейство адресов ('IPv4' или 'IPv6').
    • port <число> Порт отправителя.
    • size <число> Размер сообщения.

Если исходный адрес входящего пакета — это адрес IPv6 локальной сети, имя интерфейса добавляется к address. Например, пакет, полученный на интерфейсе en0, может иметь поле адреса 'fe80::2618:1234:ab11:3b9c%en0', где '%en0' — это имя интерфейса в качестве суффикса идентификатора зоны.

socket.addMembership(multicastAddress[, multicastInterface])

Добавлена в: v0.6.9
  • multicastAddress <строка>
  • multicastInterface <строка>

Уведомляет ядро о присоединении к группе мультикаста по заданному multicastAddress и multicastInterface с использованием параметра сокета IP_ADD_MEMBERSHIP. Если аргумент multicastInterface не указан, операционная система выберет один интерфейс и добавит к нему членство. Для добавления членства ко всем доступным интерфейсам вызовите addMembership несколько раз, по одному для каждого интерфейса.

При вызове на несвязанном сокете этот метод неявно свяжет сокет с случайным портом, прослушивая все интерфейсы.

При совместном использовании UDP-сокета несколькими cluster рабочими процессами функцию socket.addMembership() необходимо вызвать только один раз, иначе возникнет ошибка EADDRINUSE.

Модули MJS

import cluster from 'cluster';
import dgram from 'dgram';

if (cluster.isPrimary) {
  cluster.fork(); // Works ok.
  cluster.fork(); // Fails with EADDRINUSE.
} else {
  const s = dgram.createSocket('udp4');
  s.bind(1234, () => {
    s.addMembership('224.0.0.114');
  });
}

Модули CJS

const cluster = require('cluster');
const dgram = require('dgram');

if (cluster.isPrimary) {
  cluster.fork(); // Works ok.
  cluster.fork(); // Fails with EADDRINUSE.
} else {
  const s = dgram.createSocket('udp4');
  s.bind(1234, () => {
    s.addMembership('224.0.0.114');
  });
}

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

Добавлена в: v13.1.0, v12.16.0
  • sourceAddress <строка>
  • groupAddress <строка>
  • multicastInterface <строка>

Уведомляет ядро о присоединении к источнику-специфическому каналу мультикаста по заданному sourceAddress и groupAddress, используя multicastInterface с параметром сокета IP_ADD_SOURCE_MEMBERSHIP. Если аргумент multicastInterface не указан, операционная система выберет один интерфейс и добавит к нему членство. Для добавления членства ко всем доступным интерфейсам вызовите socket.addSourceSpecificMembership() несколько раз, по одному для каждого интерфейса.

При вызове на несвязанном сокете этот метод неявно свяжет сокет с случайным портом, прослушивая все интерфейсы.

socket.address()

Добавлена в: v0.1.99
  • Возвращает: <Объект>

Возвращает объект, содержащий информацию об адресе сокета. Для UDP-сокетов этот объект будет содержать свойства address, family и port.

Этот метод генерирует исключение EBADF при вызове на несвязанном сокете.

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

История
Версия Изменения
v0.9.1

Метод был изменен на асинхронный. Старый код необходимо изменить, передав функцию обратного вызова при вызове метода.

v0.1.99

Добавлена в: v0.1.99

  • port <целое число>
  • address <строка>
  • callback <Функция> без параметров. Вызывается по завершении привязки.

Для UDP-сокетов, заставляет сокет dgram.Socket прослушивать сообщения датаграмм на указанном port и, по желанию, address. Если port не указан или равен 0, операционная система попытается привязаться к случайному порту. Если address не указан, операционная система попытается прослушивать все адреса. После завершения привязки генерируется событие 'listening', и вызывается необязательная функция callback.

Указание обработчика события 'listening' и передача callback методу socket.bind() не наносит вреда, но не очень полезно.

Привязанный сокет датаграмм удерживает процесс Node.js для получения сообщений датаграмм.

Если привязка завершается неудачно, генерируется событие 'error'. В редких случаях (например, при попытке привязки к закрытому сокету) может быть выброшено исключение Error.

Пример UDP-сервера, прослушивающего порт 41234:

Модули MJS

import dgram from 'dgram';

const server = dgram.createSocket('udp4');

server.on('error', (err) => {
  console.log(`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:41234

Модули CJS

const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('error', (err) => {
  console.log(`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:41234

socket.bind(options[, callback])

Добавлена в: v0.11.14
  • options <Объект> Требуется. Поддерживает следующие свойства:
    • port <целое число>
    • address <строка>
    • exclusive <логическое значение>
    • fd <целое число>
  • callback <Функция>

Для UDP-сокетов, заставляет сокет dgram.Socket прослушивать сообщения датаграмм на указанном port и, по желанию, address, которые передаются как свойства объекта options, переданного в качестве первого аргумента. Если port не указан или равен 0, операционная система попытается привязаться к случайному порту. Если address не указан, операционная система попытается прослушивать все адреса. После завершения привязки генерируется событие 'listening', и вызывается необязательная функция callback.

Объект options может содержать свойство fd. Когда значение fd больше 0, оно будет использовать существующий сокет с заданным дескриптором файла. В этом случае свойства port и address будут проигнорированы.

Указание обработчика события 'listening' и передача callback методу socket.bind() не наносит вреда, но не очень полезно.

Объект options может содержать дополнительное свойство exclusive, которое используется при работе с объектами dgram.Socket в модуле cluster. Когда exclusive установлено в значение false (по умолчанию), рабочие процессы кластера будут использовать один и тот же сокет, что позволит совместно обрабатывать подключения. Однако, если exclusive равно true, обработчик не будет совместно использоваться, и попытка совместного использования порта приведет к ошибке.

Привязанный сокет данных (datagram) сохраняет процесс Node.js работающим для получения сообщений datagram.

Если привязка не удалась, генерируется событие 'error'. В редких случаях (например, при попытке привязки к закрытому сокету) может быть выброшено исключение Error.

Ниже показан пример сокета, прослушивающего порт в эксклюзивном режиме.

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

Закрытие сокета

Добавлен в: v0.1.99
  • callback <Функция> Вызывается, когда сокет был закрыт.

Закройте сокет и прекратите прослушивание данных на нём. Если указан колбэк, он добавляется как слушатель события 'close'.

Подключение сокета

Добавлен в: v12.0.0
  • port <целое>
  • address <строка>
  • callback <Функция> Вызывается при успешном подключении или ошибке.

Устанавливает связь сокета dgram.Socket с удалённым адресом и портом. Каждое отправленное сообщение через этот обработчик автоматически отправляется по этому адресу. Также, сокет будет получать сообщения только от этого удалённого узла. Попытка вызвать connect() на уже подключённом сокете приведёт к исключению ERR_SOCKET_DGRAM_IS_CONNECTED. Если address не указан, по умолчанию используется '127.0.0.1' (для сокетов udp4) или '::1' (для сокетов udp6). После успешного подключения генерируется событие 'connect', и вызывается опциональная функция callback. В случае ошибки вызывается callback, или, если она не определена, генерируется событие 'error'.

Отключение сокета

Добавлен в: v12.0.0

Синхронная функция, которая отсоединяет подключённый сокет dgram.Socket от его удалённого адреса. Попытка вызвать disconnect() на несвязанном или уже отключённом сокете приведёт к исключению ERR_SOCKET_DGRAM_NOT_CONNECTED.

Удаление членства в группе

Добавлен в: v0.6.9
  • multicastAddress <строка>
  • multicastInterface <строка>

Инструктирует ядро о выходе из мультикастовой группы по адресу multicastAddress используя опцию сокета IP_DROP_MEMBERSHIP. Этот метод автоматически вызывается ядром при закрытии сокета или завершении процесса, поэтому большинству приложений не нужно его вызывать.

Если multicastInterface не указан, операционная система попытается удалить членство на всех доступных интерфейсах.

Удаление членства в группе по источнику

Добавлен в: v13.1.0, v12.16.0
  • sourceAddress <строка>
  • groupAddress <строка>
  • multicastInterface <строка>

Инструктирует ядро о выходе из мультикастового канала по указанному sourceAddress и groupAddress используя опцию сокета IP_DROP_SOURCE_MEMBERSHIP. Этот метод автоматически вызывается ядром при закрытии сокета или завершении процесса, поэтому большинству приложений не нужно его вызывать.

Если multicastInterface не указан, операционная система попытается удалить членство на всех доступных интерфейсах.

Размер буфера приема

Добавлен в: v8.7.0
  • Возвращает: <число> размер буфера приема сокета в байтах.

Этот метод выбросит исключение ERR_SOCKET_BUFFER_SIZE, если вызывается на несвязанном сокете.

Размер буфера отправки

Добавлен в: v8.7.0
  • Возвращает: <число> размер буфера отправки сокета в байтах.

Этот метод выбросит исключение ERR_SOCKET_BUFFER_SIZE, если вызывается на несвязанном сокете.

Увеличение ссылок

Добавлен в: v0.9.1
  • Возвращает: <dgram.Сокет>

По умолчанию, привязка сокета блокирует выход процесса Node.js, пока сокет открыт. Метод socket.unref() можно использовать, чтобы исключить сокет из подсчёта ссылок, которые удерживают процесс Node.js активным. Метод socket.ref() добавляет сокет обратно в подсчёт ссылок и восстанавливает стандартное поведение.

Вызов socket.ref() несколько раз не повлияет на результат.

Метод socket.ref() возвращает ссылку на сокет, так что вызовы могут быть объединены.

Получение удалённого адреса

Добавлен в: v12.0.0
  • Возвращает: <Объект>

Возвращает объект, содержащий address, family, и port удалённого узла. Этот метод выбросит исключение ERR_SOCKET_DGRAM_NOT_CONNECTED, если сокет не подключён.

Отправка данных

История
Версия Изменения
v14.5.0, v12.19.0

Параметр msg теперь может быть любым TypedArray или DataView.

v12.0.0

Добавлена поддержка отправки данных по подключённым сокетам.

v8.0.0

Параметр msg теперь может быть Uint8Array.

v8.0.0

Параметр address теперь всегда является необязательным.

v6.0.0

В случае успеха, callback теперь будет вызван с аргументом error типа null, а не 0.

v5.7.0

Параметр msg теперь может быть массивом. Также, параметры offset и length являются необязательными.

v0.1.99

Добавлен в: v0.1.99

  • msg <Буфер> | <Тип массива> | <DataView> | <строка> | <массив> Отправляемое сообщение.
  • offset <целое> Смещение в буфере, где начинается сообщение.
  • length <целое> Количество байт в сообщении.
  • port <целое> Порт назначения.
  • address <строка> Имя хоста или IP-адрес назначения.
  • callback <Функция> Вызывается при успешной отправке сообщения.

Отправляет сообщение datagram через сокет. Для бессоединительных сокетов необходимо указать порт и хост назначения. Для подключённых сокетов используется связанный удалённый узел, поэтому аргументы port и address не должны задаваться.

Аргумент msg содержит сообщение, которое нужно отправить. В зависимости от его типа, может применяться различное поведение. Если msg является Buffer, любым TypedArray или DataView, то offset и length указывают смещение в Buffer, с которого начинается сообщение, и количество байтов в сообщении соответственно. Если msg является String, то он автоматически преобразуется в Buffer с кодировкой 'utf8'. При сообщениях, содержащих многобайтовые символы, offset и length будут рассчитываться относительно длины в байтах, а не позиции символа.

Аргумент address представляет собой строку. Если значение address является именем хоста, DNS будет использоваться для разрешения адреса хоста. Если address не указано или является ложным значением, по умолчанию будет использоваться '127.0.0.1' (для сокетов udp4) или '::1' (для сокетов udp6).

Если сокет ранее не был привязан с помощью вызова bind, ему назначается случайный номер порта и он привязывается к адресу "все интерфейсы" ('0.0.0.0' для сокетов udp4, '::0' для сокетов udp6).

В качестве необязательной функции может быть указана функция callback, которая может сообщать об ошибках DNS или определять, когда безопасно повторно использовать объект buf. Поиск по DNS задерживает отправку по крайней мере на один такт цикла событий Node.js.

Единственный способ точно узнать, что датаграмма была отправлена, — использовать callback. Если произойдет ошибка и будет передан callback, ошибка будет передана в качестве первого аргумента функции callback. Если callback не указан, ошибка будет отправлена как событие 'error' объекта socket.

Смещение и длина являются необязательными, но оба обязательно должны быть установлены, если используются. Они поддерживаются только в том случае, если первый аргумент является Buffer, TypedArray, или DataView.

Этот метод вызывает ERR_SOCKET_BAD_PORT, если он вызывается на несвязанном сокете.

Пример отправки UDP-пакета на порт на localhost;

MJS modules

import dgram from 'dgram';
import { Buffer } from 'buffer';

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

CJS modules

const dgram = require('dgram');
const { Buffer } = require('buffer');

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

Пример отправки UDP-пакета, состоящего из нескольких буферов, на порт на 127.0.0.1;

MJS modules

import dgram from 'dgram';
import { Buffer } from 'buffer';

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

CJS modules

const dgram = require('dgram');
const { Buffer } = require('buffer');

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

Отправка нескольких буферов может быть быстрее или медленнее в зависимости от приложения и операционной системы. Проведите бенчмаркинг, чтобы определить оптимальную стратегию в каждом конкретном случае. Однако, как правило, отправка нескольких буферов быстрее.

Пример отправки UDP-пакета с использованием сокета, подключенного к порту на localhost:

MJS modules

import dgram from 'dgram';
import { Buffer } from 'buffer';

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

CJS modules

const dgram = require('dgram');
const { Buffer } = require('buffer');

const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.connect(41234, 'localhost', (err) => {
  client.send(message, (err) => {
    client.close();
  });
});
Примечание о размере UDP-датаграммы

Максимальный размер IPv4/v6 датаграммы зависит от MTU (максимальной единицы передачи) и размера поля Payload Length.

  • Поле Payload Length имеет ширину 16 бит, что означает, что обычная полезная нагрузка не может превышать 64К байт, включая заголовок интернет-протокола и данные (65 507 байт = 65 535 − 8 байт заголовка UDP − 20 байт заголовка IP); это обычно верно для интерфейсов обратной связи, но такие длинные сообщения датаграмм непрактичны для большинства хостов и сетей.

  • MTU — это максимальный размер, который может поддерживать конкретная технология канального уровня для сообщений датаграмм. Для любого канала IPv4 предписывает минимальный MTU в 68 октетах, в то время как рекомендуемый MTU для IPv4 составляет 576 (обычно рекомендуется как MTU для приложений типа модемов), независимо от того, доходят ли они целиком или фрагментами.

    Для IPv6 минимальный MTU составляет 1280 октетов. Однако обязательный минимальный размер буфера для сборки фрагментов составляет 1500 октетов. Значение 68 октетов очень мало, так как большинство современных технологий канального уровня, таких как Ethernet, имеют минимальный MTU в 1500.

Невозможно заранее узнать MTU каждого канала, через который может пройти пакет. Отправка датаграммы больше, чем MTU получателя, не сработает, потому что пакет будет молча отброшен без уведомления источника о том, что данные не достигли получателя.

socket.setBroadcast(flag)

Добавлена в: v0.6.9
  • flag <логическое значение>

Устанавливает или сбрасывает опцию сокета SO_BROADCAST. Если установлено значение true, UDP-пакеты могут быть отправлены на адрес локального широковещания.

Этот метод вызывает EBADF при вызове на несвязанном сокете.

socket.setMulticastInterface(multicastInterface)

Добавлена в: v8.6.0
  • multicastInterface <строка>

Все ссылки на область в этом разделе относятся к индексам зон IPv6, которые определены в RFC 4007. В строковом формате IP с индексом области записывается как 'IP%scope', где область — это имя или номер интерфейса.

Устанавливает стандартный исходящий интерфейс для мультивещания сокета на выбранный интерфейс или возвращает выбор интерфейса системе. multicastInterface должно быть допустимым строковым представлением IP-адреса из семейства сокета.

Для IPv4 сокетов это должен быть IP, настроенный для требуемого физического интерфейса. Все пакеты, отправленные в мультивещание по сокету, будут отправлены по интерфейсу, определенному последним успешным вызовом этой функции.

Для IPv6 сокетов multicastInterface должен содержать область для указания интерфейса, как показано в следующих примерах. В IPv6 отдельные вызовы send могут также использовать явные области в адресах, поэтому только пакеты, отправленные на адрес мультивещания без явного указания области, будут затронуты последним успешным вызовом этой функции.

Этот метод вызывает EBADF при вызове на несвязанном сокете.

Пример: IPv6 исходящий интерфейс мультивещания

На большинстве систем, где формат области использует имя интерфейса:

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

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

В Windows, где формат области использует номер интерфейса:

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

socket.bind(1234, () => {
  socket.setMulticastInterface('::%2');
});
Пример: IPv4 исходящий интерфейс мультивещания

Все системы используют IP-адрес хоста на требуемом физическом интерфейсе:

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

socket.bind(1234, () => {
  socket.setMulticastInterface('10.0.0.2');
});
Результаты вызова

Вызов сокета, который не готов к отправке или больше не открыт, может вызвать исключение Не выполняется Error.

Если multicastInterface не может быть распарсен в IP, то выбрасывается исключение EINVAL System Error.

В IPv4, если multicastInterface — это допустимый адрес, но он не соответствует ни одному интерфейсу, или если адрес не соответствует семейству, выбрасывается System Error, например, EADDRNOTAVAIL или EPROTONOSUP.

В IPv6 большинство ошибок при указании или опущении области приведут к тому, что сокет продолжит использовать (или вернется к) выбору стандартного интерфейса системы.

Адрес семейства сокета ANY (IPv4 '0.0.0.0' или IPv6 '::') может использоваться для возвращения управления стандартным исходящим интерфейсом сокета системе для будущих пакетов мультивещания.

socket.setMulticastLoopback(flag)

Добавлена в: v0.3.8
  • flag <логическое значение>

Устанавливает или сбрасывает опцию сокета IP_MULTICAST_LOOP. При установке в true пакеты мультивещания также будут приниматься на локальном интерфейсе.

Этот метод вызывает EBADF при вызове на несвязанном сокете.

socket.setMulticastTTL(ttl)

Добавлена в: v0.3.8
  • ttl <целое число>

Устанавливает опцию сокета IP_MULTICAST_TTL. Хотя TTL обычно означает «время жизни», в данном контексте он указывает количество IP-пересадок, которые пакету разрешается пройти, в частности, для трафика мультивещания. Каждый маршрутизатор или шлюз, передающий пакет, уменьшает значение TTL. Если значение TTL уменьшается до 0 маршрутизатором, он больше не будет пересылаться.

Аргумент ttl может быть от 0 до 255. По умолчанию на большинстве систем 1.

Этот метод вызывает EBADF при вызове на несвязанном сокете.

socket.setRecvBufferSize(size)

Добавлена в: v8.7.0
  • size <целое число>

Устанавливает опцию сокета SO_RCVBUF. Устанавливает максимальный размер буфера приема сокета в байтах.

Этот метод вызывает ERR_SOCKET_BUFFER_SIZE при вызове на несвязанном сокете.

socket.setSendBufferSize(size)

Добавлена в: v8.7.0
  • size <целое число>

Устанавливает опцию сокета SO_SNDBUF. Устанавливает максимальный размер буфера отправки сокета в байтах.

Этот метод вызывает ERR_SOCKET_BUFFER_SIZE при вызове на несвязанном сокете.

socket.setTTL(ttl)

Добавлена в: v0.1.101
  • ttl <целое число>

Устанавливает параметр сокета IP_TTL. Хотя TTL обычно означает «Время жизни», в данном контексте он указывает количество IP-пересадок, которые пакет разрешено пройти. Каждый маршрутизатор или шлюз, передающий пакет, уменьшает значение TTL. Если маршрутизатор уменьшает TTL до 0, пакет не будет передан. Изменение значений TTL обычно выполняется для зондирования сети или при использовании многоадресной рассылки.

Аргумент ttl может быть от 1 до 255. По умолчанию на большинстве систем значение равно 64.

Этот метод генерирует исключение EBADF, если он вызывается для неинициализированного сокета.

socket.unref()

Добавлена в: v0.9.1
  • Возвращает: <dgram.Socket>

По умолчанию при связывании сокета процесс Node.js блокируется от завершения, пока сокет открыт. Метод socket.unref() может использоваться для исключения сокета из подсчёта ссылок, который удерживает процесс Node.js активным, позволяя процессу завершиться, даже если сокет всё ещё прослушивает.

Вызов socket.unref() несколько раз не повлияет дополнительно.

Метод socket.unref() возвращает ссылку на сокет, что позволяет использовать цепочку вызовов.

dgram модульные функции

dgram.createSocket(options[, callback])

История
Версия Изменения
v15.8.0

Добавлена поддержка AbortSignal.

v11.4.0

Поддерживается параметр ipv6Only.

v8.7.0

Теперь поддерживаются параметры recvBufferSize и sendBufferSize.

v8.6.0

Поддерживается параметр lookup.

v0.11.13

Добавлена в: v0.11.13

  • options <Объект> Доступные параметры:
    • type <строка> Семейство сокета. Должно быть либо 'udp4', либо 'udp6'. Необходимо.
    • reuseAddr <логическое значение> При использовании параметра true метод socket.bind() будет повторно использовать адрес, даже если другой процесс уже привязал сокет к нему. По умолчанию: false.
    • ipv6Only <логическое значение> Установка ipv6Only в true отключит поддержку двойного стека, т.е. привязка к адресу :: не приведет к привязке 0.0.0.0. По умолчанию: false.
    • recvBufferSize <число> Устанавливает значение сокета SO_RCVBUF.
    • sendBufferSize <число> Устанавливает значение сокета SO_SNDBUF.
    • lookup <Функция> Пользовательская функция поиска. По умолчанию: dns.lookup().
    • signal <AbortSignal> Объект AbortSignal, который может быть использован для закрытия сокета.
  • callback <Функция> Прикреплена как обработчик событий 'message'. Необязательно.
  • Возвращает: <dgram.Socket>

Создаёт объект dgram.Socket. После создания сокета, вызов socket.bind() указывает сокету начать прослушивание сообщений дейтаграммы. Если address и port не переданы методу socket.bind(), он привяжет сокет к адресу "всех интерфейсов" на случайном порту (он делает правильные вещи как для udp4, так и для udp6 сокетов). Привязанный адрес и порт могут быть получены с помощью socket.address().address и socket.address().port.

Если параметр signal включен, вызов .abort() для соответствующего AbortController аналогичен вызову .close() для сокета:

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])

Добавлена в: v0.1.99
  • type <строка> Либо 'udp4', либо 'udp6'.
  • callback <Функция> Прикреплена в качестве обработчика событий 'message'.
  • Возвращает: <dgram.Socket>

Создаёт объект dgram.Socket указанного типа type.

После создания сокета, вызов socket.bind() указывает сокету начать прослушивание сообщений дейтаграммы. Если address и port не переданы методу socket.bind(), он привяжет сокет к адресу "всех интерфейсов" на случайном порту (он делает правильные вещи как для udp4, так и для udp6 сокетов). Привязанный адрес и порт могут быть получены с помощью socket.address().address и socket.address().port.

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v16.x/docs/api/dgram.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API