Spec-Zone.ru › Node.js

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

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

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

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

Модули MJS

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

Модули CJS

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' генерируется, когда сокет готов к приёму данных. Это происходит либо явно с помощью socket.bind(), либо неявно при первом отправлении данных с помощью socket.send(). Пока сокет не в состоянии прослушивания, системные ресурсы отсутствуют, и вызовы, такие как socket.address() и socket.setTTL(), завершатся ошибкой.

Событие: 'message'

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

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

v18.0.0

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

v0.1.99

Добавлен в: 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 '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');
  });
}

Модули CJS

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 <строка>
  • 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() не наносит вреда, но не очень полезно.

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

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

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

Модули MJS

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

Модули CJS

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 <Объект> Требуется. Поддерживает следующие свойства:
    • 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, обработчик не используется совместно, а попытка совместного использования порта приводит к ошибке.

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

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

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

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

socket.close([callback])

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

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

socket[Symbol.asyncDispose]()

Добавлен в: v20.5.0, v18.18.0
Устойчивость: 1 - Экспериментальный

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

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

Добавлен в: 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'.

socket.disconnect()

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

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

socket.dropMembership(multicastAddress[, multicastInterface])

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

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

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

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

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

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

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

socket.getRecvBufferSize()

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

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

socket.getSendBufferSize()

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

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

socket.getSendQueueSize()

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

socket.getSendQueueCount()

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

socket.ref()

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

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

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

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

socket.remoteAddress()

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

Возвращает объект, содержащий 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> | <строка> | <Массив> Сообщение для отправки.
  • offset <целое число> Смещение в буфере, с которого начинается сообщение.
  • length <целое число> Количество байтов в сообщении.
  • port <целое число> Порт назначения.
  • address <строка> Имя хоста или IP-адрес назначения.
  • callback <Функция> Вызывается, когда сообщение было отправлено.

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

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();
});

Модули CJS

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;

Модули MJS

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();
});

Модули CJS

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;

Модули MJS

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();
  });
});

Модули CJS

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/v6 дейтаграммы зависит от MTU (максимальная единица передачи) и от размера поля Payload Length.

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

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

    Для 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');
}); 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
Результаты вызова

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

По умолчанию при привязке сокета процесс 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 <Объект> Доступные опции:
    • type <строка> Семейство сокета. Должно быть либо 'udp4', либо 'udp4'. Обязательно.
    • 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.сокет>

Создаёт объект 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 <строка> Либо 'udp4', либо 'udp6'.
  • callback <Функция> Прикрепляется в качестве обработчика событий 'message'.
  • Возвращает: <dgram.сокет>

Создаёт объект 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/api/dgram.html

Spec-Zone.ru

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