hs.socket.udp
Работа с пользовательскими протоколами с помощью асинхронных сокетов UDP.
Для сокетов TCP см. hs.socket.
С помощью этих сокетов можно делать много полезных и нетривиальных вещей. Пример простого пинга-понга:
function ping(data, addr)
print(data)
addr = hs.socket.parseAddress(addr)
hs.timer.doAfter(1, function()
client:send("ping", addr.host, addr.port)
end)
end
function pong(data, addr)
print(data)
addr = hs.socket.parseAddress(addr)
hs.timer.doAfter(1, function()
server:send("pong", addr.host, addr.port)
end)
end
server = hs.socket.udp.server(9001, pong):receive()
client = hs.socket.udp.new(ping):send("ping", "localhost", 9001):receive()
Что приведет к следующему бесконечному обмену:
20:26:56 LuaSkin: (secondary thread): Data written to UDP socket
LuaSkin: (secondary thread): Data read from UDP socket
ping
20:26:57 LuaSkin: (secondary thread): Data written to UDP socket
LuaSkin: (secondary thread): Data read from UDP socket
pong
20:26:58 LuaSkin: (secondary thread): Data written to UDP socket
LuaSkin: (secondary thread): Data read from UDP socket
ping
20:26:59 LuaSkin: (secondary thread): Data written to UDP socket
LuaSkin: (secondary thread): Data read from UDP socket
pong
...
Можно делать какие-то глупые вещи с фабрикой обратных вызовов и включением широковещательной рассылки:
local function callbackMaker(name)
local fun = function(data, addr)
addr = hs.socket.parseAddress(addr)
print(name.." received data:\n"..data.."\nfrom host: "..addr.host.." port: "..addr.port)
end
return fun
end
local listeners = {}
local port = 9001
for i=1,3 do
table.insert(listeners, hs.socket.udp.new(callbackMaker("listener "..i)):reusePort():listen(port):receive())
end
broadcaster = hs.socket.udp.new():broadcast()
broadcaster:send("hello!", "255.255.255.255", port)
Поскольку ни IPv4, ни IPv6 не были отключены, широковещательная рассылка принимается по обоим протоколам (показаны адреса IPv6 «с двойной стековой» поддержкой):
listener 2 received data:
hello!
from host: ::ffff:192.168.0.3 port: 53057
listener 1 received data:
hello!
from host: ::ffff:192.168.0.3 port: 53057
listener 3 received data:
hello!
from host: ::ffff:192.168.0.3 port: 53057
listener 1 received data:
hello!
from host: 192.168.0.3 port: 53057
listener 3 received data:
hello!
from host: 192.168.0.3 port: 53057
listener 2 received data:
hello!
from host: 192.168.0.3 port: 53057
Обзор API
- Переменные - Настраиваемые значения
- Функции - API-вызовы, предоставляемые непосредственно расширением
- Конструкторы - API-вызовы, возвращающие объект, обычно предоставляющий методы API
- Методы - API-вызовы, которые можно выполнить только на объекте, возвращаемом конструктором
Документация API
Переменные
timeout
| Подпись | hs.socket.udp.timeout |
|---|---|
| Тип | Переменная |
| Описание |
Таймаут для операций с сокетом в секундах. |
| Примечания |
|
| Исходный код | extensions/socket/socket.lua строка 173 |
Функции
parseAddress
| Подпись | hs.socket.udp.parseAddress(sockaddr) -> table or nil |
|---|---|
| Тип | Функция |
| Описание |
Псевдоним для |
| Параметры | |
| Возвращаемое значение | |
| Исходный код | extensions/socket/socket.lua строка 184 |
Конструкторы
new
| Подпись | hs.socket.udp.new([fn]) -> hs.socket.udp object |
|---|---|
| Тип | Конструктор |
| Описание |
Создает объект асинхронного сокета UDP без соединения. |
| Параметры |
|
| Возвращаемое значение |
|
| Исходный код | extensions/socket/libsocket_udp.m строка 111 |
server
| Подпись | hs.socket.udp.server(port[, fn]) -> hs.socket.udp object |
|---|---|
| Тип | Конструктор |
| Описание |
Создает сокет UDP и привязывает его к порту для прослушивания. |
| Параметры |
|
| Возвращаемое значение |
|
| Исходный код | extensions/socket/socket.lua строка 208 |
Методы
broadcast
| Подпись | hs.socket.udp:broadcast([flag]) -> self or nil |
|---|---|
| Тип | Метод |
| Описание |
Включает широковещательную рассылку в базовом сокете. |
| Параметры |
|
| Возвращаемое значение |
|
| Примечания |
|
| Исходный код | extensions/socket/libsocket_udp.m строка 418 |
close
| Подпись | hs.socket.udp:close() -> self |
|---|---|
| Тип | Метод |
| Описание |
Немедленно закрывает сокет, освобождая его для повторного использования. Любые ожидающие операции отправки отбрасываются. |
| Параметры |
|
| Возвращаемое значение |
|
| Исходный код | extensions/socket/libsocket_udp.m строка 222 |
closed
| Подпись | hs.socket.udp:closed() -> bool |
|---|---|
| Тип | Метод |
| Описание |
Возвращает статус закрытия сокета. |
| Параметры |
|
| Возвращаемое значение |
|
| Примечания |
|
| Исходный код | extensions/socket/libsocket_udp.m строка 675 |
connect
| Подпись | hs.socket.udp:connect(host, port[, fn]) -> self or nil |
|---|---|
| Тип | Метод |
| Описание |
Подключает сокет, если он не подключен. |
| Параметры |
|
| Возвращаемое значение |
|
| Примечания |
|
| Исходный код | extensions/socket/libsocket_udp.m строка 145 |
connected
| Подпись | hs.socket.udp:connected() -> bool |
|---|---|
| Тип | Метод |
| Описание |
Возвращает статус подключения сокета. |
| Параметры |
|
| Возвращаемое значение |
|
| Примечания |
|
| Исходный код | extensions/socket/libsocket_udp.m строка 652 |
enableIPv
| Подпись | hs.socket.udp:enableIPv(version[, flag]) -> self or nil |
|---|---|
| Тип | Метод |
| Описание |
Включает или отключает IPv4 или IPv6 на базовом сокете. По умолчанию оба включены. |
| Параметры |
|
| Возвращаемое значение |
|
| Примечания |
|
| Исходный код | extensions/socket/libsocket_udp.m строка 486 |
info
| Подпись | hs.socket.udp:info() -> table |
|---|---|
| Тип | Метод |
| Описание |
Возвращает информацию о сокете. |
| Параметры |
|
| Возвращаемое значение |
|
| Исходный код | extensions/socket/libsocket_udp.m строка 699 |
listen
| Подпись | hs.socket.udp:listen(port) -> self or nil |
|---|---|
| Тип | Метод |
| Описание |
Привязывает неподключенный сокет к порту для прослушивания. |
| Параметры |
|
| Возвращаемое значение |
|
| Исходный код | extensions/socket/libsocket_udp.m строка 192 |
pause
| Подпись | hs.socket.udp:pause() -> self |
|---|---|
| Тип | Метод |
| Описание |
Приостанавливает чтение пакетов из сокета. |
| Параметры |
|
| Возвращаемое значение |
|
| Примечания |
|
| Исходный код | extensions/socket/libsocket_udp.m строка 243 |
preferIPv
| Подпись | hs.socket.udp:preferIPv([version]) -> self |
|---|---|
| Тип | Метод |
| Описание |
Устанавливает предпочтительную версию IP: IPv4, IPv6 или нейтральную (первая для разрешения). |
| Параметры |
|
| Возвращаемое значение |
|
| Примечания |
|
| Исходный код | extensions/socket/libsocket_udp.m строка 523 |
read
| Подпись | hs.socket.udp:read(delimiter[, tag]) -> self |
|---|---|
| Тип | Метод |
| Описание |
Псевдоним для |
| Параметры | |
| Возвращаемое значение | |
| Исходный код | extensions/socket/socket.lua строка 237 |
readOne
| Подпись | hs.socket.udp:readOne(delimiter[, tag]) -> self |
|---|---|
| Тип | Метод |
| Описание |
Псевдоним для |
| Параметры | |
| Возвращаемое значение | |
| Исходный код | extensions/socket/socket.lua строка 243 |
receive
| Подпись | hs.socket.udp:receive([fn]) -> self or nil |
|---|---|
| Тип | Метод |
| Описание |
Читает пакеты из сокета по мере их поступления. |
| Параметры |
|
| Возвращаемое значение |
|
| Примечания |
|
| Исходный код | extensions/socket/libsocket_udp.m строка 295 |
receiveOne
| Подпись | hs.socket.udp:receiveOne([fn]) -> self or nil |
|---|---|
| Тип | Метод |
| Описание |
Считывает один пакет из сокета. |
| Параметры |
|
| Возвращаемое значение |
|
| Примечания |
|
| Исходный код | extensions/socket/libsocket_udp.m строка 321 |
reusePort
| Signature | hs.socket.udp:reusePort([flag]) -> self or nil |
|---|---|
| Type | Method |
| Description |
Включает повторное использование порта на сокете. |
| Parameters |
|
| Returns |
|
| Notes |
|
| Source | extensions/socket/libsocket_udp.m строка 452 |
send
| Signature | hs.socket.udp:send(message[, host, port][, tag, fn]) -> self |
|---|---|
| Type | Method |
| Description |
Отправляет пакет по указанному адресу назначения. |
| Parameters |
|
| Returns |
|
| Notes |
|
| Source | extensions/socket/libsocket_udp.m строка 347 |
setBufferSize
| Signature | hs.socket.udp:setBufferSize(size[, version]) -> self |
|---|---|
| Type | Method |
| Description |
Устанавливает максимальный размер буфера, который будет выделен для операций приёма. |
| Parameters |
|
| Returns |
|
| Notes |
|
| Source | extensions/socket/libsocket_udp.m строка 555 |
setCallback
| Signature | hs.socket.udp:setCallback([fn]) -> self |
|---|---|
| Type | Method |
| Description |
Устанавливает функцию обратного вызова для чтения из сокета. |
| Parameters |
|
| Returns |
|
| Notes |
|
| Source | extensions/socket/libsocket_udp.m строка 597 |
setTimeout
| Signature | hs.socket.udp:setTimeout(timeout) -> self |
|---|---|
| Type | Method |
| Description |
Устанавливает таймаут для операций с сокетом. |
| Parameters |
|
| Returns |
|
| Notes |
|
| Source | extensions/socket/libsocket_udp.m строка 628 |
write
| Signature | hs.socket.udp:write(message[, tag]) -> self |
|---|---|
| Type | Method |
| Description |
Псевдоним для |
| Parameters | |
| Returns | |
| Source | extensions/socket/socket.lua строка 249 |
© 2014–2017 Hammerspoon contributors
Licensed under the MIT License.
https://www.hammerspoon.org/docs/hs.socket.udp.html