UDP/дейтаграммные сокеты
Исходный код: lib/dgram.js
Модуль dgram предоставляет реализацию UDP-дейтаграммных сокетов.
МОДУЛИ MJS
import dgram from 'dgram';
const server = dgram.createSocket('udp4');
server.on('error', (err) => {
console.log(`server error:\n${err.stack}`);
server.close();
});
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
server.on('listening', () => {
const address = server.address();
console.log(`server listening ${address.address}:${address.port}`);
});
server.bind(41234);
// Prints: server listening 0.0.0.0:41234
МОДУЛИ CJS
const dgram = require('dgram');
const server = dgram.createSocket('udp4');
server.on('error', (err) => {
console.log(`server error:\n${err.stack}`);
server.close();
});
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
server.on('listening', () => {
const address = server.address();
console.log(`server listening ${address.address}:${address.port}`);
});
server.bind(41234);
// Prints: server listening 0.0.0.0:41234 Класс: dgram.Socket
- Расширяет: <EventEmitter>
Оборачивает функциональность датаграмм.
Новые экземпляры dgram.Socket создаются с помощью dgram.createSocket(). Ключевое слово new не следует использовать для создания экземпляров dgram.Socket.
Событие: 'close'
Событие 'close' генерируется после закрытия сокета с помощью close(). После срабатывания новые события 'message' на этом сокете больше не будут генерироваться.
Событие: 'connect'
Событие 'connect' генерируется после ассоциации сокета с удаленным адресом в результате успешного вызова connect().
Событие: 'error'
-
exception<Ошибка>
Событие 'error' генерируется всякий раз, когда возникает ошибка. Функция обработчика события получает один аргумент — объект Error.
Событие: 'listening'
Событие 'listening' генерируется после того, как сокет dgram.Socket становится доступным для приема данных. Это происходит либо явно с помощью socket.bind(), либо неявно при первом отправлении данных с помощью socket.send(). До тех пор, пока сокет dgram.Socket не находится в состоянии прослушивания, подлежащие ресурсы системы отсутствуют, и такие вызовы, как 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 'cluster';
import dgram from 'dgram';
if (cluster.isPrimary) {
cluster.fork(); // Works ok.
cluster.fork(); // Fails with EADDRINUSE.
} else {
const s = dgram.createSocket('udp4');
s.bind(1234, () => {
s.addMembership('224.0.0.114');
});
}
Модули CJS
const cluster = require('cluster');
const dgram = require('dgram');
if (cluster.isPrimary) {
cluster.fork(); // Works ok.
cluster.fork(); // Fails with EADDRINUSE.
} else {
const s = dgram.createSocket('udp4');
s.bind(1234, () => {
s.addMembership('224.0.0.114');
});
}
socket.addSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])
Уведомляет ядро о присоединении к источнику-специфическому каналу мультикаста по заданному 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() не наносит вреда, но не очень полезно.
Привязанный сокет датаграмм удерживает процесс Node.js для получения сообщений датаграмм.
Если привязка завершается неудачно, генерируется событие 'error'. В редких случаях (например, при попытке привязки к закрытому сокету) может быть выброшено исключение Error.
Пример UDP-сервера, прослушивающего порт 41234:
Модули MJS
import dgram from 'dgram';
const server = dgram.createSocket('udp4');
server.on('error', (err) => {
console.log(`server error:\n${err.stack}`);
server.close();
});
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
server.on('listening', () => {
const address = server.address();
console.log(`server listening ${address.address}:${address.port}`);
});
server.bind(41234);
// Prints: server listening 0.0.0.0:41234
Модули CJS
const dgram = require('dgram');
const server = dgram.createSocket('udp4');
server.on('error', (err) => {
console.log(`server error:\n${err.stack}`);
server.close();
});
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
server.on('listening', () => {
const address = server.address();
console.log(`server listening ${address.address}:${address.port}`);
});
server.bind(41234);
// Prints: server listening 0.0.0.0:41234
socket.bind(options[, callback])
-
options<Объект> Требуется. Поддерживает следующие свойства:-
port<целое число> -
address<строка> -
exclusive<логическое значение> -
fd<целое число>
-
-
callback<Функция>
Для UDP-сокетов, заставляет сокет dgram.Socket прослушивать сообщения датаграмм на указанном port и, по желанию, address, которые передаются как свойства объекта options, переданного в качестве первого аргумента. Если port не указан или равен 0, операционная система попытается привязаться к случайному порту. Если address не указан, операционная система попытается прослушивать все адреса. После завершения привязки генерируется событие 'listening', и вызывается необязательная функция callback.
Объект options может содержать свойство fd. Когда значение fd больше 0, оно будет использовать существующий сокет с заданным дескриптором файла. В этом случае свойства port и address будут проигнорированы.
Указание обработчика события 'listening' и передача callback методу socket.bind() не наносит вреда, но не очень полезно.
Объект options может содержать дополнительное свойство exclusive, которое используется при работе с объектами dgram.Socket в модуле cluster. Когда exclusive установлено в значение false (по умолчанию), рабочие процессы кластера будут использовать один и тот же сокет, что позволит совместно обрабатывать подключения. Однако, если exclusive равно true, обработчик не будет совместно использоваться, и попытка совместного использования порта приведет к ошибке.
Привязанный сокет данных (datagram) сохраняет процесс Node.js работающим для получения сообщений datagram.
Если привязка не удалась, генерируется событие 'error'. В редких случаях (например, при попытке привязки к закрытому сокету) может быть выброшено исключение Error.
Ниже показан пример сокета, прослушивающего порт в эксклюзивном режиме.
socket.bind({
address: 'localhost',
port: 8000,
exclusive: true
}); Закрытие сокета
-
callback<Функция> Вызывается, когда сокет был закрыт.
Закройте сокет и прекратите прослушивание данных на нём. Если указан колбэк, он добавляется как слушатель события 'close'.
Подключение сокета
Устанавливает связь сокета dgram.Socket с удалённым адресом и портом. Каждое отправленное сообщение через этот обработчик автоматически отправляется по этому адресу. Также, сокет будет получать сообщения только от этого удалённого узла. Попытка вызвать connect() на уже подключённом сокете приведёт к исключению ERR_SOCKET_DGRAM_IS_CONNECTED. Если address не указан, по умолчанию используется '127.0.0.1' (для сокетов udp4) или '::1' (для сокетов udp6). После успешного подключения генерируется событие 'connect', и вызывается опциональная функция callback. В случае ошибки вызывается callback, или, если она не определена, генерируется событие 'error'.
Отключение сокета
Синхронная функция, которая отсоединяет подключённый сокет dgram.Socket от его удалённого адреса. Попытка вызвать disconnect() на несвязанном или уже отключённом сокете приведёт к исключению ERR_SOCKET_DGRAM_NOT_CONNECTED.
Удаление членства в группе
Инструктирует ядро о выходе из мультикастовой группы по адресу multicastAddress используя опцию сокета IP_DROP_MEMBERSHIP. Этот метод автоматически вызывается ядром при закрытии сокета или завершении процесса, поэтому большинству приложений не нужно его вызывать.
Если multicastInterface не указан, операционная система попытается удалить членство на всех доступных интерфейсах.
Удаление членства в группе по источнику
Инструктирует ядро о выходе из мультикастового канала по указанному sourceAddress и groupAddress используя опцию сокета IP_DROP_SOURCE_MEMBERSHIP. Этот метод автоматически вызывается ядром при закрытии сокета или завершении процесса, поэтому большинству приложений не нужно его вызывать.
Если multicastInterface не указан, операционная система попытается удалить членство на всех доступных интерфейсах.
Размер буфера приема
- Возвращает: <число> размер буфера приема сокета в байтах.
Этот метод выбросит исключение ERR_SOCKET_BUFFER_SIZE, если вызывается на несвязанном сокете.
Размер буфера отправки
- Возвращает: <число> размер буфера отправки сокета в байтах.
Этот метод выбросит исключение ERR_SOCKET_BUFFER_SIZE, если вызывается на несвязанном сокете.
Увеличение ссылок
- Возвращает: <dgram.Сокет>
По умолчанию, привязка сокета блокирует выход процесса Node.js, пока сокет открыт. Метод socket.unref() можно использовать, чтобы исключить сокет из подсчёта ссылок, которые удерживают процесс Node.js активным. Метод socket.ref() добавляет сокет обратно в подсчёт ссылок и восстанавливает стандартное поведение.
Вызов socket.ref() несколько раз не повлияет на результат.
Метод socket.ref() возвращает ссылку на сокет, так что вызовы могут быть объединены.
Получение удалённого адреса
- Возвращает: <Объект>
Возвращает объект, содержащий address, family, и port удалённого узла. Этот метод выбросит исключение ERR_SOCKET_DGRAM_NOT_CONNECTED, если сокет не подключён.
Отправка данных
-
msg<Буфер> | <Тип массива> | <DataView> | <строка> | <массив> Отправляемое сообщение. -
offset<целое> Смещение в буфере, где начинается сообщение. -
length<целое> Количество байт в сообщении. -
port<целое> Порт назначения. -
address<строка> Имя хоста или IP-адрес назначения. -
callback<Функция> Вызывается при успешной отправке сообщения.
Отправляет сообщение datagram через сокет. Для бессоединительных сокетов необходимо указать порт и хост назначения. Для подключённых сокетов используется связанный удалённый узел, поэтому аргументы port и address не должны задаваться.
Аргумент msg содержит сообщение, которое нужно отправить. В зависимости от его типа, может применяться различное поведение. Если msg является Buffer, любым TypedArray или DataView, то offset и length указывают смещение в Buffer, с которого начинается сообщение, и количество байтов в сообщении соответственно. Если msg является String, то он автоматически преобразуется в Buffer с кодировкой 'utf8'. При сообщениях, содержащих многобайтовые символы, offset и length будут рассчитываться относительно длины в байтах, а не позиции символа.
Аргумент address представляет собой строку. Если значение address является именем хоста, DNS будет использоваться для разрешения адреса хоста. Если address не указано или является ложным значением, по умолчанию будет использоваться '127.0.0.1' (для сокетов udp4) или '::1' (для сокетов udp6).
Если сокет ранее не был привязан с помощью вызова bind, ему назначается случайный номер порта и он привязывается к адресу "все интерфейсы" ('0.0.0.0' для сокетов udp4, '::0' для сокетов udp6).
В качестве необязательной функции может быть указана функция callback, которая может сообщать об ошибках DNS или определять, когда безопасно повторно использовать объект buf. Поиск по DNS задерживает отправку по крайней мере на один такт цикла событий Node.js.
Единственный способ точно узнать, что датаграмма была отправлена, — использовать callback. Если произойдет ошибка и будет передан callback, ошибка будет передана в качестве первого аргумента функции callback. Если callback не указан, ошибка будет отправлена как событие 'error' объекта socket.
Смещение и длина являются необязательными, но оба обязательно должны быть установлены, если используются. Они поддерживаются только в том случае, если первый аргумент является Buffer, TypedArray, или DataView.
Этот метод вызывает ERR_SOCKET_BAD_PORT, если он вызывается на несвязанном сокете.
Пример отправки UDP-пакета на порт на localhost;
MJS modules
import dgram from 'dgram';
import { Buffer } from 'buffer';
const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.send(message, 41234, 'localhost', (err) => {
client.close();
});
CJS modules
const dgram = require('dgram');
const { Buffer } = require('buffer');
const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.send(message, 41234, 'localhost', (err) => {
client.close();
}); Пример отправки UDP-пакета, состоящего из нескольких буферов, на порт на 127.0.0.1;
MJS modules
import dgram from 'dgram';
import { Buffer } from 'buffer';
const buf1 = Buffer.from('Some ');
const buf2 = Buffer.from('bytes');
const client = dgram.createSocket('udp4');
client.send([buf1, buf2], 41234, (err) => {
client.close();
});
CJS modules
const dgram = require('dgram');
const { Buffer } = require('buffer');
const buf1 = Buffer.from('Some ');
const buf2 = Buffer.from('bytes');
const client = dgram.createSocket('udp4');
client.send([buf1, buf2], 41234, (err) => {
client.close();
}); Отправка нескольких буферов может быть быстрее или медленнее в зависимости от приложения и операционной системы. Проведите бенчмаркинг, чтобы определить оптимальную стратегию в каждом конкретном случае. Однако, как правило, отправка нескольких буферов быстрее.
Пример отправки UDP-пакета с использованием сокета, подключенного к порту на localhost:
MJS modules
import dgram from 'dgram';
import { Buffer } from 'buffer';
const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.connect(41234, 'localhost', (err) => {
client.send(message, (err) => {
client.close();
});
});
CJS modules
const dgram = require('dgram');
const { Buffer } = require('buffer');
const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.connect(41234, 'localhost', (err) => {
client.send(message, (err) => {
client.close();
});
}); Примечание о размере UDP-датаграммы
Максимальный размер IPv4/v6 датаграммы зависит от MTU (максимальной единицы передачи) и размера поля Payload Length.
-
Поле
Payload Lengthимеет ширину 16 бит, что означает, что обычная полезная нагрузка не может превышать 64К байт, включая заголовок интернет-протокола и данные (65 507 байт = 65 535 − 8 байт заголовка UDP − 20 байт заголовка IP); это обычно верно для интерфейсов обратной связи, но такие длинные сообщения датаграмм непрактичны для большинства хостов и сетей. -
MTU— это максимальный размер, который может поддерживать конкретная технология канального уровня для сообщений датаграмм. Для любого канала IPv4 предписывает минимальныйMTUв 68 октетах, в то время как рекомендуемыйMTUдля IPv4 составляет 576 (обычно рекомендуется какMTUдля приложений типа модемов), независимо от того, доходят ли они целиком или фрагментами.Для IPv6 минимальный
MTUсоставляет 1280 октетов. Однако обязательный минимальный размер буфера для сборки фрагментов составляет 1500 октетов. Значение 68 октетов очень мало, так как большинство современных технологий канального уровня, таких как Ethernet, имеют минимальныйMTUв 1500.
Невозможно заранее узнать MTU каждого канала, через который может пройти пакет. Отправка датаграммы больше, чем MTU получателя, не сработает, потому что пакет будет молча отброшен без уведомления источника о том, что данные не достигли получателя.
socket.setBroadcast(flag)
Устанавливает или сбрасывает опцию сокета 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');
}); В Windows, где формат области использует номер интерфейса:
const socket = dgram.createSocket('udp6');
socket.bind(1234, () => {
socket.setMulticastInterface('::%2');
}); Пример: IPv4 исходящий интерфейс мультивещания
Все системы используют IP-адрес хоста на требуемом физическом интерфейсе:
const socket = dgram.createSocket('udp4');
socket.bind(1234, () => {
socket.setMulticastInterface('10.0.0.2');
}); Результаты вызова
Вызов сокета, который не готов к отправке или больше не открыт, может вызвать исключение Не выполняется Error.
Если multicastInterface не может быть распарсен в IP, то выбрасывается исключение EINVAL System Error.
В IPv4, если multicastInterface — это допустимый адрес, но он не соответствует ни одному интерфейсу, или если адрес не соответствует семейству, выбрасывается System Error, например, EADDRNOTAVAIL или EPROTONOSUP.
В IPv6 большинство ошибок при указании или опущении области приведут к тому, что сокет продолжит использовать (или вернется к) выбору стандартного интерфейса системы.
Адрес семейства сокета ANY (IPv4 '0.0.0.0' или IPv6 '::') может использоваться для возвращения управления стандартным исходящим интерфейсом сокета системе для будущих пакетов мультивещания.
socket.setMulticastLoopback(flag)
Устанавливает или сбрасывает опцию сокета 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.Socket>
По умолчанию при связывании сокета процесс Node.js блокируется от завершения, пока сокет открыт. Метод socket.unref() может использоваться для исключения сокета из подсчёта ссылок, который удерживает процесс Node.js активным, позволяя процессу завершиться, даже если сокет всё ещё прослушивает.
Вызов socket.unref() несколько раз не повлияет дополнительно.
Метод socket.unref() возвращает ссылку на сокет, что позволяет использовать цепочку вызовов.
dgram модульные функции
dgram.createSocket(options[, callback])
-
options<Объект> Доступные параметры:-
type<строка> Семейство сокета. Должно быть либо'udp4', либо'udp6'. Необходимо. -
reuseAddr<логическое значение> При использовании параметраtrueметодsocket.bind()будет повторно использовать адрес, даже если другой процесс уже привязал сокет к нему. По умолчанию:false. -
ipv6Only<логическое значение> Установкаipv6Onlyвtrueотключит поддержку двойного стека, т.е. привязка к адресу::не приведет к привязке0.0.0.0. По умолчанию:false. -
recvBufferSize<число> Устанавливает значение сокетаSO_RCVBUF. -
sendBufferSize<число> Устанавливает значение сокетаSO_SNDBUF. -
lookup<Функция> Пользовательская функция поиска. По умолчанию:dns.lookup(). -
signal<AbortSignal> Объект AbortSignal, который может быть использован для закрытия сокета.
-
-
callback<Функция> Прикреплена как обработчик событий'message'. Необязательно. - Возвращает: <dgram.Socket>
Создаёт объект dgram.Socket. После создания сокета, вызов socket.bind() указывает сокету начать прослушивание сообщений дейтаграммы. Если address и port не переданы методу socket.bind(), он привяжет сокет к адресу "всех интерфейсов" на случайном порту (он делает правильные вещи как для udp4, так и для udp6 сокетов). Привязанный адрес и порт могут быть получены с помощью socket.address().address и socket.address().port.
Если параметр signal включен, вызов .abort() для соответствующего AbortController аналогичен вызову .close() для сокета:
const controller = new AbortController();
const { signal } = controller;
const server = dgram.createSocket({ type: 'udp4', signal });
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
// Later, when you want to close the server.
controller.abort();
dgram.createSocket(type[, callback])
-
type<строка> Либо'udp4', либо'udp6'. -
callback<Функция> Прикреплена в качестве обработчика событий'message'. - Возвращает: <dgram.Socket>
Создаёт объект dgram.Socket указанного типа type.
После создания сокета, вызов socket.bind() указывает сокету начать прослушивание сообщений дейтаграммы. Если address и port не переданы методу socket.bind(), он привяжет сокет к адресу "всех интерфейсов" на случайном порту (он делает правильные вещи как для udp4, так и для udp6 сокетов). Привязанный адрес и порт могут быть получены с помощью socket.address().address и socket.address().port.
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v16.x/docs/api/dgram.html