UDP/дейтаграммные сокеты
Исходный код: 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
- Расширяет: <EventEmitter>
Оборачивает функциональность работы с датаграммами.
Новые экземпляры dgram.Socket создаются с помощью dgram.createSocket(). Ключевое слово new не должно использоваться для создания экземпляров dgram.Socket.
Событие: 'close'
Событие 'close' генерируется после закрытия сокета с помощью close(). После срабатывания больше событий 'message' на этом сокете генерироваться не будут.
Событие: 'connect'
Событие 'connect' генерируется после успешного связывания сокета с удаленным адресом в результате вызова connect().
Событие: 'error'
-
exception<Error>
Событие 'error' генерируется при возникновении любой ошибки. Обработчик события получает единственный аргумент — объект Error.
Событие: 'listening'
Событие 'listening' генерируется, когда сокет готов к приёму данных. Это происходит либо явно с помощью socket.bind(), либо неявно при первом отправлении данных с помощью socket.send(). Пока сокет не в состоянии прослушивания, системные ресурсы отсутствуют, и вызовы, такие как socket.address() и socket.setTTL(), завершатся ошибкой.
Событие: 'message'
Событие 'message' генерируется при поступлении новой датаграммы на сокет. Обработчик события получает два аргумента: msg и rinfo.
Если адрес источника входящего пакета — локальный адрес IPv6, имя интерфейса добавляется к address. Например, пакет, полученный на интерфейсе en0, может иметь поле адреса, установленное в 'fe80::2618:1234:ab11:3b9c%en0', где '%en0' — имя интерфейса в качестве суффикса идентификатора зоны.
socket.addMembership(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])
Уведомляет ядро о присоединении к многоадресной группе с указанным sourceAddress и groupAddress, используя параметр сокета multicastInterface с IP_ADD_SOURCE_MEMBERSHIP параметром. Если параметр multicastInterface не указан, операционная система выберет один интерфейс и добавит членство к нему. Для добавления членства ко всем доступным интерфейсам, вызовите socket.addSourceSpecificMembership() по одному разу для каждого интерфейса.
При вызове на несвязанном сокете, этот метод неявно связывается со случайным портом, прослушивая все интерфейсы.
socket.address()
- Возвращает: <Объект>
Возвращает объект с информацией об адресе сокета. Для UDP-сокетов этот объект будет содержать свойства address, family, и port.
Этот метод генерирует EBADF если вызывается на несвязанном сокете.
socket.bind([port][, address][, callback])
-
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])
-
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])
-
callback<Функция> Вызывается при закрытии сокета.
Закрыть базовый сокет и прекратить прослушивание данных на нём. Если указан обратный вызов, он добавляется как обработчик события 'close'.
socket[Symbol.asyncDispose]()
Вызывает socket.close() и возвращает промис, который выполняется при закрытии сокета.
socket.connect(port[, address][, callback])
-
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()
Синхронная функция, которая разъединяет подключённый сокет dgram.Socket от его удалённого адреса. Попытка вызвать disconnect() на несвязанном или уже отключённом сокете приведёт к исключению ERR_SOCKET_DGRAM_NOT_CONNECTED.
socket.dropMembership(multicastAddress[, multicastInterface])
Инструктирует ядро покинуть мультигруппу по адресу multicastAddress используя опцию сокета IP_DROP_MEMBERSHIP. Этот метод автоматически вызывается ядром при закрытии сокета или завершении процесса, поэтому большинство приложений никогда не будут вызывать его.
Если multicastInterface не указан, операционная система попытается покинуть группу на всех допустимых интерфейсах.
socket.dropSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])
Инструктирует ядро покинуть мультиканальную группу с указанным sourceAddress и groupAddress используя опцию сокета IP_DROP_SOURCE_MEMBERSHIP. Этот метод автоматически вызывается ядром при закрытии сокета или завершении процесса, поэтому большинство приложений никогда не будут вызывать его.
Если multicastInterface не указан, операционная система попытается покинуть группу на всех допустимых интерфейсах.
socket.getRecvBufferSize()
- Возвращает: <число> размер буфера приёма сокета в байтах.
Этот метод выбрасывает ERR_SOCKET_BUFFER_SIZE, если вызывается на несвязанном сокете.
socket.getSendBufferSize()
- Возвращает: <число> размер буфера отправки сокета в байтах.
Этот метод выбрасывает ERR_SOCKET_BUFFER_SIZE, если вызывается на несвязанном сокете.
socket.getSendQueueSize()
- Возвращает: <число> Количество байтов, ожидающих отправки.
socket.getSendQueueCount()
- Возвращает: <число> Количество запросов отправки в очереди, ожидающих обработки.
socket.ref()
- Возвращает: <dgram.Сокет>
По умолчанию, привязка сокета заблокирует выход процесса Node.js, пока сокет открыт. Метод socket.unref() может использоваться для исключения сокета из подсчёта ссылок, который удерживает процесс Node.js активным. Метод socket.ref() добавляет сокет обратно в подсчёт ссылок и восстанавливает стандартное поведение.
Вызов socket.ref() несколько раз не повлияет на результат.
Метод socket.ref() возвращает ссылку на сокет, позволяя использовать цепочки вызовов.
socket.remoteAddress()
- Возвращает: <Объект>
Возвращает объект, содержащий address, family и port удалённого узла. Этот метод выбрасывает исключение ERR_SOCKET_DGRAM_NOT_CONNECTED, если сокет не подключён.
socket.send(msg[, offset, length][, port][, address][, callback])
-
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)
-
flag<логическое>
Устанавливает или сбрасывает опцию сокета SO_BROADCAST. Если установлено значение true, UDP-пакеты могут быть отправлены на адрес широковещательной рассылки локального интерфейса.
Этот метод вызывает EBADF при вызове на несвязанном сокете.
socket.setMulticastInterface(multicastInterface)
-
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)
-
flag<логическое>
Устанавливает или сбрасывает опцию сокета IP_MULTICAST_LOOP. Если установлено значение true, пакеты многоадресной рассылки также будут получены на локальном интерфейсе.
Этот метод вызывает EBADF при вызове на несвязанном сокете.
socket.setMulticastTTL(ttl)
-
ttl<целое число>
Устанавливает параметр сокета IP_MULTICAST_TTL. Хотя TTL обычно обозначает «время жизни», в данном контексте он определяет количество IP-пересадок, которые пакет разрешено пройти, конкретно для мультимедийного трафика. Каждый маршрутизатор или шлюз, передающий пакет, уменьшает значение TTL. Если маршрутизатор уменьшит TTL до 0, пакет не будет перенаправлен.
Аргумент ttl может принимать значения от 0 до 255. По умолчанию на большинстве систем установлено значение 1.
Этот метод генерирует исключение EBADF, если вызывается для несвязанного сокета.
socket.setRecvBufferSize(size)
-
size<целое число>
Устанавливает параметр сокета SO_RCVBUF. Устанавливает максимальный буфер приема сокета в байтах.
Этот метод генерирует исключение ERR_SOCKET_BUFFER_SIZE, если вызывается для несвязанного сокета.
socket.setSendBufferSize(size)
-
size<целое число>
Устанавливает параметр сокета SO_SNDBUF. Устанавливает максимальный буфер отправки сокета в байтах.
Этот метод генерирует исключение ERR_SOCKET_BUFFER_SIZE, если вызывается для несвязанного сокета.
socket.setTTL(ttl)
-
ttl<целое число>
Устанавливает параметр сокета IP_TTL. Хотя TTL обычно обозначает «время жизни», в данном контексте он определяет количество IP-пересадок, которые пакет разрешено пройти. Каждый маршрутизатор или шлюз, передающий пакет, уменьшает значение TTL. Если маршрутизатор уменьшит TTL до 0, пакет не будет перенаправлен. Изменение значений TTL обычно выполняется для сетевых зондирований или при мультивещании.
Аргумент ttl может принимать значения от 1 до 255. По умолчанию на большинстве систем установлено значение 64.
Этот метод генерирует исключение EBADF, если вызывается для несвязанного сокета.
socket.unref()
- Возвращает: <dgram.сокет>
По умолчанию при привязке сокета процесс Node.js блокируется от выхода до тех пор, пока сокет открыт. Метод socket.unref() может использоваться для исключения сокета из подсчета ссылок, который удерживает процесс Node.js активным, что позволяет процессу выйти, даже если сокет по-прежнему прослушивает.
Вызов socket.unref() несколько раз не повлияет на результат.
Метод socket.unref() возвращает ссылку на сокет, что позволяет выполнять цепочку вызовов.
node:dgram функции модуля
dgram.createSocket(options[, callback])
-
options<Объект> Доступные опции:-
type<строка> Семейство сокета. Должно быть либо'udp4', либо'udp4'. Обязательно. -
reuseAddr<логическое значение> Когдаtruesocket.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])
-
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