Spec-Zone.ru › Node.js 18 LTS

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

Добавлен в: 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
  • Возвращает: <число> размер буфера приема сокета SO_RCVBUF в байтах.

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

socket.getSendBufferSize()

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

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

socket.getSendQueueSize()

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

socket.getSendQueueCount()

Добавлен в: v18.8.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 вместо 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 не указан или имеет значение nullish, используется '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 бит, что означает, что обычный полезный груз не может превышать 64K октетов, включая заголовок интернета и данные (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' или '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.Сокет>

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

Spec-Zone.ru

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