Spec-Zone.ru › Node.js 20 LTS

UDP-сокеты (дейтаграммы)

Стабильность: 2 — Стабильный

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

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

Модули JavaScript
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:41234
CommonJS
const 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: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' возникает при любой ошибке. Функции-обработчику события передается один объект Error.

Событие: 'listening'

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

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

Событие: 'message'

История
Версия Изменения
v18.4.0

Свойство family теперь возвращает строку вместо числа.

v18.0.0

Свойство family теперь возвращает число вместо строки.

v0.1.99

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

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

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

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

socket.addMembership(multicastAddress[, multicastInterface])

Добавлено в: v0.6.9
  • multicastAddress <string>
  • multicastInterface <string>

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

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

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

Модули JavaScript
import cluster from 'node:cluster';
import dgram from 'node: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');
  });
}
CommonJS
const cluster = require('node:cluster');
const dgram = require('node: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 <string>
  • groupAddress <string>
  • multicastInterface <string>

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

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

socket.address()

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

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

Если вызвать этот метод для несвязанного сокета, он выбросит EBADF.

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

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

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

v0.1.99

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

  • port <integer>
  • address <string>
  • callback <Function> Без параметров. Вызывается после завершения привязки.

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

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

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

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

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

Модули JavaScript
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:41234
CommonJS
const 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:41234

socket.bind(options[, callback])

Добавлено в: v0.11.14
  • options <Object> Обязательный параметр. Поддерживает следующие свойства:
    • port <integer>
    • address <string>
    • exclusive <boolean>
    • fd <integer>
  • callback <Function>

Для сокетов 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, дескриптор не будет общим, и попытка совместного использования порта приведет к ошибке.

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

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

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

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

socket.close([callback])

Добавлено в: v0.1.99
  • callback <Function> Вызывается после закрытия сокета.

Закрывает базовый сокет и прекращает прослушивание данных на нем. Если передана функция обратного вызова, она добавляется в качестве обработчика события 'close'.

socket[Symbol.asyncDispose]()

Добавлено в: v20.5.0
Стабильность: 1 — Экспериментальный

Вызывает socket.close() и возвращает промис, который выполняется после закрытия сокета.

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

Добавлено в: v12.0.0
  • port <integer>
  • address <string>
  • callback <Function> Вызывается после установления соединения или при возникновении ошибки.

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

socket.disconnect()

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

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

socket.dropMembership(multicastAddress[, multicastInterface])

Добавлено в: v0.6.9
  • multicastAddress <string>
  • multicastInterface <string>

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

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

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

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

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

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

socket.getRecvBufferSize()

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

Если вызвать этот метод для несвязанного сокета, он выбросит ERR_SOCKET_BUFFER_SIZE.

socket.getSendBufferSize()

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

Если вызвать этот метод для несвязанного сокета, он выбросит ERR_SOCKET_BUFFER_SIZE.

socket.getSendQueueSize()

Добавлено в: v18.8.0, v16.19.0
  • Возвращает: <number> количество байтов, поставленных в очередь на отправку.

socket.getSendQueueCount()

Добавлено в: v18.8.0, v16.19.0
  • Возвращает: <number> количество запросов на отправку, ожидающих обработки в очереди.

socket.ref()

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

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

Повторный вызов socket.ref() не оказывает дополнительного эффекта.

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

socket.remoteAddress()

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

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

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

История
Версия Изменения
v17.0.0

Параметр address теперь принимает только string, null или undefined.

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 <Buffer> | <TypedArray> | <DataView> | <string> | <Array> Отправляемое сообщение.
  • offset <integer> Смещение в буфере, с которого начинается сообщение.
  • length <integer> Количество байтов в сообщении.
  • port <integer> Порт назначения.
  • address <string> Имя хоста или IP-адрес назначения.
  • callback <Function> Вызывается после отправки сообщения.

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

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

Аргумент address представляет собой строку. Если значение address является именем хоста, для определения адреса хоста используется DNS. Если address не указан или имеет значение null, по умолчанию используются '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;

Модули JavaScript
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();
});
CommonJS
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();
});

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

Модули JavaScript
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();
});
CommonJS
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();
});

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

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

Модули JavaScript
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();
  });
});
CommonJS
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();
  });
});
Примечание о размере дейтаграмм UDP

Максимальный размер дейтаграммы IPv4/IPv6 зависит от 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 октетов очень мало, поскольку минимальное значение MTU большинства современных технологий канального уровня, например Ethernet, составляет 1500.

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

socket.setBroadcast(flag)

Добавлено в: v0.6.9
  • flag <boolean>

Включает или отключает параметр сокета SO_BROADCAST. Если задано значение true, UDP-пакеты можно отправлять на широковещательный адрес локального интерфейса.

Если вызвать этот метод для несвязанного сокета, он выбросит EBADF.

socket.setMulticastInterface(multicastInterface)

Добавлено в: v8.6.0
  • multicastInterface <string>

Все упоминания области действия в этом разделе относятся к индексам зоны 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');
}); copy

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

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

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

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

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

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

Вызов для сокета, который не готов к отправке или уже закрыт, может выбросить ошибку Not running 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 <boolean>

Устанавливает или сбрасывает параметр сокета IP_MULTICAST_LOOP. Если он установлен в true, пакеты многоадресной рассылки также будут приниматься на локальном интерфейсе.

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

socket.setMulticastTTL(ttl)

Добавлено в: v0.3.8
  • ttl <integer>

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

Аргумент ttl может принимать значения от 0 до 255. В большинстве систем значение по умолчанию — 1.

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

socket.setRecvBufferSize(size)

Добавлено в: v8.7.0
  • size <integer>

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

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

socket.setSendBufferSize(size)

Добавлено в: v8.7.0
  • size <integer>

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

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

socket.setTTL(ttl)

Добавлено в: v0.1.101
  • ttl <integer>

Устанавливает параметр сокета IP_TTL. Хотя TTL обычно расшифровывается как «Time to Live» («время жизни»), в данном контексте он задаёт количество переходов между 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() возвращает ссылку на сокет, поэтому вызовы можно объединять в цепочки.

Функции модуля node: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 <Object> Доступные параметры:
    • type <string> Семейство сокета. Должно быть 'udp4' или 'udp6'. Обязательный параметр.
    • reuseAddr <boolean> Если установлено значение true, socket.bind() будет повторно использовать адрес, даже если другой процесс уже привязал к нему сокет. По умолчанию: false.
    • ipv6Only <boolean> Установка для ipv6Only значения true отключит поддержку двух стеков, то есть привязка к адресу :: не приведёт к привязке 0.0.0.0. По умолчанию: false.
    • recvBufferSize <number> Устанавливает значение сокета SO_RCVBUF.
    • sendBufferSize <number> Устанавливает значение сокета SO_SNDBUF.
    • lookup <Function> Пользовательская функция поиска. По умолчанию: dns.lookup().
    • signal <AbortSignal> AbortSignal, который можно использовать для закрытия сокета.
  • callback <Function> Назначается обработчиком событий '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(); copy

dgram.createSocket(type[, callback])

Добавлено в: v0.1.99
  • type <string> Либо 'udp4', либо 'udp6'.
  • callback <Function> Назначается обработчиком событий '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-v20.x/docs/api/dgram.html

Spec-Zone.ru

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