Сокеты UDP/датаграмм
Стабильность: 2 — Стабильный API
Модуль node:dgram предоставляет реализацию сокетов UDP-датаграмм.
Модули JavaScript
import dgram from 'node:dgram';
const server = dgram.createSocket('udp4');
server.on('error', (err) => {
console.error(`server error:\n${err.stack}`);
server.close();
});
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
server.on('listening', () => {
const address = server.address();
console.log(`server listening ${address.address}:${address.port}`);
});
server.bind(41234);
// Prints: server listening 0.0.0.0:41234
CommonJS
const dgram = require('node:dgram');
const server = dgram.createSocket('udp4');
server.on('error', (err) => {
console.error(`server error:\n${err.stack}`);
server.close();
});
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
server.on('listening', () => {
const address = server.address();
console.log(`server listening ${address.address}:${address.port}`);
});
server.bind(41234);
// Prints: server listening 0.0.0.0:41234
Класс: dgram.Socket
- Наследует:
<EventEmitter>
Инкапсулирует функциональность датаграмм.
Новые экземпляры dgram.Socket создаются с помощью dgram.createSocket(). Ключевое слово new не следует использовать для создания экземпляров dgram.Socket.
Событие: 'close'
Событие 'close' возникает после закрытия сокета с помощью close(). После его возникновения на этом сокете больше не будут возникать события 'message'.
Событие: 'connect'
Событие 'connect' возникает после связывания сокета с удаленным адресом в результате успешного вызова connect().
Событие: 'error'
-
exception<Error>
Событие '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:
Модули JavaScript
import cluster from 'node:cluster';
import dgram from 'node:dgram';
if (cluster.isPrimary) {
cluster.fork(); // Works ok.
cluster.fork(); // Fails with EADDRINUSE.
} else {
const s = dgram.createSocket('udp4');
s.bind(1234, () => {
s.addMembership('224.0.0.114');
});
}
CommonJS
const cluster = require('node:cluster');
const dgram = require('node:dgram');
if (cluster.isPrimary) {
cluster.fork(); // Works ok.
cluster.fork(); // Fails with EADDRINUSE.
} else {
const s = dgram.createSocket('udp4');
s.bind(1234, () => {
s.addMembership('224.0.0.114');
});
}
socket.addSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])
Указывает ядру присоединиться к многоадресному каналу с заданным источником по указанным sourceAddress и groupAddress, используя multicastInterface с параметром сокета IP_ADD_SOURCE_MEMBERSHIP. Если аргумент multicastInterface не указан, операционная система выберет интерфейс и добавит членство в группу для него. Чтобы добавить членство для каждого доступного интерфейса, вызовите socket.addSourceSpecificMembership() несколько раз — по одному разу для каждого интерфейса.
При вызове для несвязанного сокета этот метод неявно привяжет его к случайному порту и будет прослушивать все интерфейсы.
socket.address()
- Возвращает:
<Object>
Возвращает объект с информацией об адресе сокета. Для UDP-сокетов этот объект содержит свойства address, family и port.
Если вызвать этот метод для несвязанного сокета, он выбросит EBADF.
socket.bind([port][, address][, callback])
-
port<integer> -
address<string> -
callback<Function>Вызывается после завершения привязки.
Для UDP-сокетов заставляет dgram.Socket прослушивать датаграммы на указанном port и необязательном address. Если port не указан или равен 0, операционная система попытается привязать сокет к случайному порту. Если address не указан, операционная система попытается прослушивать все адреса. После завершения привязки возникает событие 'listening' и вызывается необязательная функция callback.
Указание одновременно обработчика события 'listening' и передача callback методу socket.bind() не повредит, но и не принесет особой пользы.
Привязанный сокет датаграмм не позволяет процессу Node.js завершиться, чтобы принимать сообщения-датаграммы.
Если привязка не удалась, возникает событие 'error'. В редких случаях (например, при попытке привязки закрытого сокета) может быть выброшено исключение Error.
Пример UDP-сервера, прослушивающего порт 41234:
Модули JavaScript
import dgram from 'node:dgram';
const server = dgram.createSocket('udp4');
server.on('error', (err) => {
console.error(`server error:\n${err.stack}`);
server.close();
});
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
server.on('listening', () => {
const address = server.address();
console.log(`server listening ${address.address}:${address.port}`);
});
server.bind(41234);
// Prints: server listening 0.0.0.0:41234
CommonJS
const dgram = require('node:dgram');
const server = dgram.createSocket('udp4');
server.on('error', (err) => {
console.error(`server error:\n${err.stack}`);
server.close();
});
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
server.on('listening', () => {
const address = server.address();
console.log(`server listening ${address.address}:${address.port}`);
});
server.bind(41234);
// Prints: server listening 0.0.0.0:41234
socket.bind(options[, callback])
-
options<Object>Обязательный параметр. Поддерживает следующие свойства: -
callback<Function>
Для UDP-сокетов заставляет dgram.Socket прослушивать датаграммы на указанном port и необязательном address, переданных в качестве свойств объекта options в первом аргументе. Если port не указан или равен 0, операционная система попытается привязать сокет к случайному порту. Если address не указан, операционная система попытается прослушивать все адреса. После завершения привязки возникает событие 'listening' и вызывается необязательная функция callback.
Объект options может содержать свойство fd. Если задано значение fd больше 0, объект будет обертывать существующий сокет с указанным файловым дескриптором. В этом случае свойства port и address будут проигнорированы.
Указание одновременно обработчика события 'listening' и передача callback методу socket.bind() не повредит, но и не принесет особой пользы.
Объект options может содержать дополнительное свойство exclusive, используемое при работе с объектами dgram.Socket в модуле cluster. Если для exclusive задано значение false (по умолчанию), рабочие процессы кластера будут использовать один и тот же базовый дескриптор сокета, что позволит распределять обработку соединений. Однако если exclusive равно true, дескриптор не будет общим, и попытка совместного использования порта приведет к ошибке. Создание dgram.Socket с параметром reusePort, установленным в true, приводит к тому, что при вызове socket.bind() значение exclusive всегда будет true.
Привязанный сокет датаграмм не позволяет процессу Node.js завершиться, чтобы принимать сообщения-датаграммы.
Если привязка не удалась, возникает событие 'error'. В редких случаях (например, при попытке привязки закрытого сокета) может быть выброшено исключение Error.
Ниже показан пример сокета, прослушивающего эксклюзивный порт.
socket.bind({
address: 'localhost',
port: 8000,
exclusive: true,
});
jscopy
socket.close([callback])
-
callback<Function>Вызывается после закрытия сокета.
Закрывает базовый сокет и прекращает прослушивание данных на нем. Если передана функция обратного вызова, она добавляется в качестве обработчика события 'close'.
socket[Symbol.asyncDispose]()
Вызывает socket.close() и возвращает промис, который выполняется после закрытия сокета.
socket.connect(port[, address][, callback])
-
port<integer> -
address<string> -
callback<Function>Вызывается после установления соединения или при ошибке.
Связывает dgram.Socket с удаленным адресом и портом. Каждое сообщение, отправляемое этим дескриптором, автоматически отправляется указанному получателю. Кроме того, сокет будет получать сообщения только от этого удаленного узла. Попытка вызвать connect() для уже подключенного сокета приведет к исключению ERR_SOCKET_DGRAM_IS_CONNECTED. Если address не указан, по умолчанию используются '127.0.0.1' (для сокетов udp4) или '::1' (для сокетов udp6). После установления соединения возникает событие 'connect' и вызывается необязательная функция callback. В случае ошибки вызывается функция callback либо, если она отсутствует, возникает событие 'error'.
socket.disconnect()
Синхронная функция, которая отменяет привязку подключенного 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()
- Возвращает:
<number>размер буфера приема сокетаSO_RCVBUFв байтах.
Если вызвать этот метод для несвязанного сокета, он выбросит ERR_SOCKET_BUFFER_SIZE.
socket.getSendBufferSize()
- Возвращает:
<number>размер буфера отправки сокетаSO_SNDBUFв байтах.
Если вызвать этот метод для несвязанного сокета, он выбросит ERR_SOCKET_BUFFER_SIZE.
socket.getSendQueueSize()
- Возвращает:
<number>количество байтов в очереди отправки.
socket.getSendQueueCount()
- Возвращает:
<number>количество запросов на отправку, ожидающих обработки в очереди.
socket.ref()
- Возвращает:
<dgram.Socket>
По умолчанию привязка сокета не позволяет процессу Node.js завершиться, пока сокет открыт. Метод socket.unref() позволяет исключить сокет из подсчета ссылок, который поддерживает активность процесса Node.js. Метод socket.ref() снова добавляет сокет в подсчет ссылок и восстанавливает поведение по умолчанию.
Повторные вызовы socket.ref() не имеют дополнительного эффекта.
Метод socket.ref() возвращает ссылку на сокет, поэтому вызовы можно объединять в цепочку.
socket.remoteAddress()
- Возвращает:
<Object>
Возвращает объект, содержащий address, family и port удаленной конечной точки. Если сокет не подключен, этот метод выбрасывает исключение ERR_SOCKET_DGRAM_NOT_CONNECTED.
socket.send(msg[, offset, length][, port][, address][, callback])
-
msg<Buffer>|<TypedArray>|<DataView>|<string>|<Array>Отправляемое сообщение. -
offset<integer>Смещение в буфере, с которого начинается сообщение. -
length<integer>Количество байтов в сообщении. -
port<integer>Порт назначения. -
address<string>Имя хоста или IP-адрес назначения. -
callback<Function>Вызывается после отправки сообщения.
Отправляет датаграмму через сокет. Для сокетов без соединения необходимо указать адрес назначения port и address. Подключенные сокеты используют связанную с ними удаленную конечную точку, поэтому аргументы port и address задавать нельзя.
Аргумент msg содержит отправляемое сообщение. В зависимости от его типа поведение может различаться. Если msg имеет тип Buffer, является любым TypedArray или представляет собой DataView, параметры offset и length задают смещение в Buffer, с которого начинается сообщение, и количество байтов в сообщении соответственно. Если msg имеет тип String, он автоматически преобразуется в Buffer с кодировкой 'utf8'. Для сообщений, содержащих многобайтовые символы, значения offset и length вычисляются с учетом длины в байтах, а не позиции символа. Если msg является массивом, параметры offset и length указывать нельзя.
Аргумент address — это строка. Если значение address является именем хоста, для определения адреса хоста будет использоваться DNS. Если address не задан или равен null, по умолчанию используются '127.0.0.1' (для сокетов udp4) или '::1' (для сокетов udp6).
Если сокет ранее не был привязан вызовом bind, ему назначается случайный номер порта, и он привязывается к адресу «все интерфейсы» ('0.0.0.0' для сокетов udp4, '::0' для сокетов udp6).
Необязательную функцию callback можно указать для обработки ошибок DNS или определения момента, когда объект buf можно безопасно использовать повторно. Поиск DNS задерживает отправку как минимум на один такт цикла событий Node.js.
Единственный способ достоверно узнать, что датаграмма отправлена, — использовать callback. Если возникла ошибка и передан callback, ошибка будет передана в качестве первого аргумента функции callback. Если callback не передан, ошибка возникает как событие 'error' объекта socket.
Параметры смещения и длины необязательны, но оба должны быть заданы, если используется хотя бы один из них. Они поддерживаются только в том случае, если первый аргумент — Buffer, TypedArray или DataView.
Если вызвать этот метод для несвязанного сокета, он выбросит ERR_SOCKET_BAD_PORT.
Пример отправки UDP-пакета на порт хоста localhost;
Модули JavaScript
import dgram from 'node:dgram';
import { Buffer } from 'node:buffer';
const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.send(message, 41234, 'localhost', (err) => {
client.close();
});
CommonJS
const dgram = require('node:dgram');
const { Buffer } = require('node:buffer');
const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.send(message, 41234, 'localhost', (err) => {
client.close();
});
Пример отправки UDP-пакета, составленного из нескольких буферов, на порт хоста 127.0.0.1;
Модули JavaScript
import dgram from 'node:dgram';
import { Buffer } from 'node:buffer';
const buf1 = Buffer.from('Some ');
const buf2 = Buffer.from('bytes');
const client = dgram.createSocket('udp4');
client.send([buf1, buf2], 41234, (err) => {
client.close();
});
CommonJS
const dgram = require('node:dgram');
const { Buffer } = require('node:buffer');
const buf1 = Buffer.from('Some ');
const buf2 = Buffer.from('bytes');
const client = dgram.createSocket('udp4');
client.send([buf1, buf2], 41234, (err) => {
client.close();
});
В зависимости от приложения и операционной системы отправка нескольких буферов может быть как быстрее, так и медленнее. Проведите тестирование производительности, чтобы в каждом конкретном случае определить оптимальную стратегию. Однако, как правило, отправка нескольких буферов быстрее.
Пример отправки UDP-пакета с помощью сокета, подключенного к порту хоста localhost:
Модули JavaScript
import dgram from 'node:dgram';
import { Buffer } from 'node:buffer';
const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.connect(41234, 'localhost', (err) => {
client.send(message, (err) => {
client.close();
});
});
CommonJS
const dgram = require('node:dgram');
const { Buffer } = require('node:buffer');
const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.connect(41234, 'localhost', (err) => {
client.send(message, (err) => {
client.close();
});
});
Примечание о размере UDP-датаграмм
Максимальный размер датаграммы IPv4/IPv6 зависит от MTU (максимального размера передаваемого блока) и размера поля Payload Length.
-
Ширина поля
Payload Lengthсоставляет 16 бит, а это значит, что обычная полезная нагрузка не может превышать 64 КБ, включая интернет-заголовок и данные (65 507 байт = 65 535 − 8 байт заголовка UDP − 20 байт заголовка IP); это обычно верно для интерфейсов обратной связи, однако такие длинные сообщения-датаграммы непрактичны для большинства хостов и сетей. -
MTU— это максимальный размер, поддерживаемый данной технологией канального уровня для сообщений-датаграмм. Для любого канала IPv4 требует минимальное значениеMTUв 68 октетов, а рекомендуемое значениеMTUдля IPv4 составляет 576 (обычно оно рекомендуется в качествеMTUдля приложений с коммутируемым доступом), независимо от того, приходят данные целиком или фрагментами.Для IPv6 минимальное значение
MTUсоставляет 1280 октетов. Однако обязательный минимальный размер буфера для сборки фрагментов составляет 1500 октетов. Значение в 68 октетов очень мало, поскольку у большинства современных технологий канального уровня, например Ethernet, минимальное значениеMTUсоставляет 1500.
Невозможно заранее узнать MTU каждого канала, через который может пройти пакет. Отправка датаграммы, превышающей MTU получателя, не сработает: пакет будет молча отброшен, и источник не получит уведомления о том, что данные не достигли адресата.
socket.setBroadcast(flag)
-
flag<boolean>
Устанавливает или сбрасывает параметр сокета SO_BROADCAST. Если он установлен в true, UDP-пакеты можно отправлять на широковещательный адрес локального интерфейса.
Если вызвать этот метод для несвязанного сокета, он выбросит EBADF.
socket.setMulticastInterface(multicastInterface)
-
multicastInterface<string>
Все упоминания области действия в этом разделе относятся к индексам зон IPv6, определённым в RFC 4007. В строковом представлении IP-адрес с индексом области действия записывается как 'IP%scope', где областью действия является имя или номер интерфейса.
Устанавливает для сокета исходящий интерфейс многоадресной рассылки по умолчанию в виде выбранного интерфейса или возвращает выбор интерфейса системе. Значение multicastInterface должно быть допустимым строковым представлением IP-адреса семейства сокета.
Для сокетов IPv4 это должен быть IP-адрес, настроенный для нужного физического интерфейса. Все пакеты, отправляемые через сокет на адрес многоадресной рассылки, будут отправляться через интерфейс, определённый последним успешным вызовом этого метода.
Для сокетов IPv6 значение multicastInterface должно содержать область действия, указывающую интерфейс, как показано в следующих примерах. В IPv6 отдельные вызовы send также могут использовать явную область действия в адресах, поэтому последний успешный вызов этого метода влияет только на пакеты, отправленные на адрес многоадресной рассылки без указания явной области действия.
Этот метод выбрасывает EBADF, если вызван для несвязанного сокета.
Пример: исходящий интерфейс многоадресной рассылки IPv6
В большинстве систем, где формат области действия использует имя интерфейса:
const socket = dgram.createSocket('udp6');
socket.bind(1234, () => {
socket.setMulticastInterface('::%eth1');
});
jscopy
В Windows, где формат области действия использует номер интерфейса:
const socket = dgram.createSocket('udp6');
socket.bind(1234, () => {
socket.setMulticastInterface('::%2');
});
jscopyПример: исходящий интерфейс многоадресной рассылки IPv4
Во всех системах используется IP-адрес узла на нужном физическом интерфейсе:
const socket = dgram.createSocket('udp4');
socket.bind(1234, () => {
socket.setMulticastInterface('10.0.0.2');
});
jscopyРезультаты вызова
Вызов для сокета, который ещё не готов к отправке или уже закрыт, может выбросить Error с сообщением Not running.
Если значение multicastInterface не удаётся разобрать как IP-адрес, выбрасывается System Error с сообщением EINVAL.
Для IPv4, если multicastInterface является допустимым адресом, но не соответствует ни одному интерфейсу, или если адрес не соответствует семейству, выбрасывается System Error, например EADDRNOTAVAIL или EPROTONOSUP.
Для IPv6 большинство ошибок, связанных с указанием или отсутствием области действия, приведут к тому, что сокет продолжит использовать (или вернётся к использованию) выбор интерфейса по умолчанию, определяемый системой.
ANY-адрес семейства адресов сокета (IPv4 '0.0.0.0' или IPv6 '::') можно использовать, чтобы вернуть системе управление выбором исходящего интерфейса сокета для будущих пакетов многоадресной рассылки.
socket.setMulticastLoopback(flag)
-
flag<boolean>
Устанавливает или сбрасывает параметр сокета IP_MULTICAST_LOOP. Если установлено значение true, пакеты многоадресной рассылки также будут приниматься на локальном интерфейсе.
Этот метод выбрасывает EBADF, если вызван для несвязанного сокета.
socket.setMulticastTTL(ttl)
-
ttl<integer>
Устанавливает параметр сокета IP_MULTICAST_TTL. Хотя TTL обычно означает «время жизни», в этом контексте он задаёт количество переходов между IP-узлами, которое может пройти пакет, в частности, для трафика многоадресной рассылки. Каждый маршрутизатор или шлюз, пересылающий пакет, уменьшает TTL. Если маршрутизатор уменьшит TTL до 0, пакет не будет переслан.
Аргумент ttl может принимать значения от 0 до 255. Значение по умолчанию в большинстве систем — 1.
Этот метод выбрасывает EBADF, если вызван для несвязанного сокета.
socket.setRecvBufferSize(size)
-
size<integer>
Устанавливает параметр сокета SO_RCVBUF. Задаёт максимальный размер буфера приёма сокета в байтах.
Этот метод выбрасывает ERR_SOCKET_BUFFER_SIZE, если вызван для несвязанного сокета.
socket.setSendBufferSize(size)
-
size<integer>
Устанавливает параметр сокета SO_SNDBUF. Задаёт максимальный размер буфера отправки сокета в байтах.
Этот метод выбрасывает ERR_SOCKET_BUFFER_SIZE, если вызван для несвязанного сокета.
socket.setTTL(ttl)
-
ttl<integer>
Устанавливает параметр сокета 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() возвращает ссылку на сокет, поэтому вызовы можно объединять в цепочку.
node:dgram функции модуля
dgram.createSocket(options[, callback])
-
options<Object>Доступны следующие параметры:-
type<string>Семейство сокета. Должно быть'udp4'или'udp6'. Обязательный параметр. -
reuseAddr<boolean>Если значение равноtrue,socket.bind()повторно использует адрес, даже если другой процесс уже выполнил привязку сокета к нему, но получать данные сможет только один сокет. По умолчанию:false. -
reusePort<boolean>Если значение равноtrue,socket.bind()повторно использует порт, даже если другой процесс уже выполнил привязку сокета к нему. Входящие датаграммы распределяются между ожидающими сокетами. Этот параметр доступен только на некоторых платформах, например Linux 3.9+, DragonFlyBSD 3.6+, FreeBSD 12.0+, Solaris 11.4 и AIX 7.2.5+. На неподдерживаемых платформах при привязке сокета возникает ошибка. По умолчанию:false. -
ipv6Only<boolean>Если установить дляipv6Onlyзначениеtrue, поддержка dual-stack будет отключена, то есть привязка к адресу::не приведёт к привязке0.0.0.0. По умолчанию:false. -
recvBufferSize<number>Устанавливает значение параметра сокетаSO_RCVBUF. -
sendBufferSize<number>Устанавливает значение параметра сокетаSO_SNDBUF. -
lookup<Function>Пользовательская функция поиска. По умолчанию:dns.lookup(). -
signal<AbortSignal>AbortSignal, который можно использовать для закрытия сокета. -
receiveBlockList<net.BlockList>receiveBlockListможно использовать для отбрасывания входящих датаграмм с определённых IP-адресов, IP-диапазонов или IP-подсетей. Это не работает, если сервер находится за обратным прокси-сервером, NAT и т. п., поскольку проверяется адрес прокси-сервера или адрес, указанный NAT. -
sendBlockList<net.BlockList>sendBlockListможно использовать для отключения исходящего доступа к определённым IP-адресам, IP-диапазонам или IP-подсетям.
-
-
callback<Function>Добавляется как обработчик событий'message'. Необязательный параметр. - Возвращает:
<dgram.Socket>
Создаёт объект dgram.Socket. После создания сокета вызов socket.bind() укажет сокету начать прослушивание сообщений-датаграмм. Если параметры address и port не переданы в socket.bind(), метод привяжет сокет к адресу «все интерфейсы» на случайном порту (метод корректно работает как с сокетами udp4, так и с сокетами udp6). Получить адрес и порт привязки можно с помощью socket.address().address и socket.address().port.
Если параметр signal включён, вызов .abort() для соответствующего AbortController аналогичен вызову .close() для сокета:
const controller = new AbortController();
const { signal } = controller;
const server = dgram.createSocket({ type: 'udp4', signal });
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
// Later, when you want to close the server.
controller.abort();
jscopy
dgram.createSocket(type[, callback])
-
type<string>Должно быть'udp4'или'udp6'. -
callback<Function>Добавляется как обработчик событий'message'. - Возвращает:
<dgram.Socket>
Создаёт объект dgram.Socket указанного типа type.
После создания сокета вызов socket.bind() укажет сокету начать прослушивание сообщений-датаграмм. Если параметры address и port не переданы в socket.bind(), метод привяжет сокет к адресу «все интерфейсы» на случайном порту (метод корректно работает как с сокетами udp4, так и с сокетами udp6). Получить адрес и порт привязки можно с помощью socket.address().address и socket.address().port.
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/api/dgram.html