UDPSocket
Создаёт сокет UDP, который может использоваться для отправки и получения сообщений UDP.
В следующих примерах создаются: * сервер эхо, который прослушивает подключения и возвращает любое полученное сообщение; * клиент, который подключается к серверу, отправляет сообщение и печатает полученное в ответ сообщение.
Сервер реализован следующим образом:
use "net"
class MyUDPNotify is UDPNotify
fun ref received(
sock: UDPSocket ref,
data: Array[U8] iso,
from: NetAddress)
=>
sock.write(consume data, from)
fun ref not_listening(sock: UDPSocket ref) =>
None
actor Main
new create(env: Env) =>
try
UDPSocket(env.root as AmbientAuth,
MyUDPNotify, "", "8989")
end
Клиент реализован следующим образом:
use "net"
class MyUDPNotify is UDPNotify
let _out: OutStream
let _destination: NetAddress
new create(
out: OutStream,
destination: NetAddress)
=>
_out = out
_destination = destination
fun ref listening(sock: UDPSocket ref) =>
sock.write("hello world", _destination)
fun ref received(
sock: UDPSocket ref,
data: Array[U8] iso,
from: NetAddress)
=>
_out.print("GOT:" + String.from_array(consume data))
sock.dispose()
fun ref not_listening(sock: UDPSocket ref) =>
None
actor Main
new create(env: Env) =>
try
let destination =
DNS.ip4(env.root as AmbientAuth, "localhost", "8989")(0)?
UDPSocket(env.root as AmbientAuth,
recover MyUDPNotify(env.out, consume destination) end)
end
actor tag UDPSocket
Конструкторы
create
Прослушивает как IPv4, так и IPv6 датаграммы.
new tag create( auth: (AmbientAuth val | NetAuth val | UDPAuth val), notify: UDPNotify iso, host: String val = "", service: String val = "0", size: USize val = 1024) : UDPSocket tag^
Параметры
- auth: (AmbientAuth val | NetAuth val | UDPAuth val)
- notify: UDPNotify iso
- host: String val = ""
- service: String val = "0"
- size: USize val = 1024
Возвращает
- UDPSocket tag^
ip4
Прослушивает IPv4 датаграммы.
new tag ip4( auth: (AmbientAuth val | NetAuth val | UDPAuth val), notify: UDPNotify iso, host: String val = "", service: String val = "0", size: USize val = 1024) : UDPSocket tag^
Параметры
- auth: (AmbientAuth val | NetAuth val | UDPAuth val)
- notify: UDPNotify iso
- host: String val = ""
- service: String val = "0"
- size: USize val = 1024
Возвращает
- UDPSocket tag^
ip6
Прослушивает IPv6 датаграммы.
new tag ip6( auth: (AmbientAuth val | NetAuth val | UDPAuth val), notify: UDPNotify iso, host: String val = "", service: String val = "0", size: USize val = 1024) : UDPSocket tag^
Параметры
- auth: (AmbientAuth val | NetAuth val | UDPAuth val)
- notify: UDPNotify iso
- host: String val = ""
- service: String val = "0"
- size: USize val = 1024
Возвращает
- UDPSocket tag^
Публичные методы
write
Записать последовательность байтов.
be write( data: (String val | Array[U8 val] val), to: NetAddress val)
Параметры
- data: (String val | Array[U8 val] val)
- to: NetAddress val
writev
Записать последовательность последовательностей байтов.
be writev( data: ByteSeqIter val, to: NetAddress val)
Параметры
- data: ByteSeqIter val
- to: NetAddress val
set_notify
Изменить уведомление.
be set_notify( notify: UDPNotify iso)
Параметры
- notify: UDPNotify iso
set_broadcast
Включить или выключить возможность передачи данных в режиме широковещания с данного сокета.
be set_broadcast( state: Bool val)
Параметры
- state: Bool val
set_multicast_interface
По умолчанию ОС выбирает адрес для отправки пакетов, предназначенных для многоадресной рассылки. Это можно использовать для принудительного выбора определённого интерфейса. Для возвращения к выбору ОС, вызовите с пустой строкой.
be set_multicast_interface( from: String val = "")
Параметры
- from: String val = ""
set_multicast_loopback
По умолчанию пакеты, отправленные на многоадресную группу, будут получены отправляющей системой, если она подписана на эту группу. Отключение loopback предотвращает это.
be set_multicast_loopback( loopback: Bool val)
Параметры
- loopback: Bool val
set_multicast_ttl
Установить TTL для многоадресной рассылки. По умолчанию 1.
be set_multicast_ttl( ttl: U8 val)
Параметры
- ttl: U8 val
multicast_join
Добавить многоадресную группу. Это может быть ограничено пакетами, поступающими на определённый интерфейс.
be multicast_join( group: String val, to: String val = "")
Параметры
multicast_leave
Удалить многоадресную группу. Это может быть ограничено пакетами, поступающими на определённый интерфейс. Не предпринимается попыток проверить, добавлял ли этот сокет эту группу ранее.
be multicast_leave( group: String val, to: String val = "")
Параметры
dispose
Остановить прослушивание.
be dispose()
Публичные функции
local_address
Возвращает привязанный IP-адрес.
fun box local_address() : NetAddress val
Возвращает
- NetAddress val
getsockopt
Общий обработчик для сокетов UDP вызова getsockopt(2) системы.
Вызывающая сторона должна предоставить массив, предварительно выделенный размером не менее, чем у самой большой структуры данных, которая может быть возвращена ядром для запрошенного параметра.
В случае успеха вызова системы, эта функция возвращает 2-кортеж: 1. Целое значение 0. 2. Массив данных, возвращённых 4-м аргументом вызова системы. Его размер указан ядром через 5-й аргумент вызова системы.
В случае неудачи вызова системы, эта функция возвращает 2-кортеж: 1. Значение errno. 2. Неопределённое значение, которое следует игнорировать.
Пример использования:
// listening() is a callback function for class UDPNotify
fun ref listening(sock: UDPSocket ref) =>
match sock.getsockopt(OSSockOpt.sol_socket(), OSSockOpt.so_rcvbuf(), 4)
| (0, let gbytes: Array[U8] iso) =>
try
let br = Reader.create().>append(consume gbytes)
ifdef littleendian then
let buffer_size = br.u32_le()?
else
let buffer_size = br.u32_be()?
end
end
| (let errno: U32, _) =>
// System call failed
end
fun ref getsockopt( level: I32 val, option_name: I32 val, option_max_size: USize val = 4) : (U32 val , Array[U8 val] iso^)
Параметры
Возвращает
getsockopt_u32
Обработчик для сокетов UDP вызова getsockopt(2) системы, где возвращаемое значение параметра ядром имеет тип C uint32_t / Pony тип U32.
В случае успеха вызова системы, эта функция возвращает 2-кортеж: 1. Целое значение 0. 2. Значение *option_value, возвращённое ядром, преобразованное в Pony U32.
В случае неудачи вызова системы, эта функция возвращает 2-кортеж: 1. Значение errno. 2. Неопределённое значение, которое следует игнорировать.
fun ref getsockopt_u32( level: I32 val, option_name: I32 val) : (U32 val , U32 val)
Параметры
Возвращает
setsockopt
Общий обработчик для сокетов UDP вызова setsockopt(2) системы.
Вызывающая сторона отвечает за корректный размер и байтовое содержимое массива option для запрошенного level и option_name, включая использование соответствующего порядка байт для CPU.
Функция возвращает 0 при успехе, иначе значение errno при ошибке.
Пример использования:
// listening() is a callback function for class UDPNotify
fun ref listening(sock: UDPSocket ref) =>
let sb = Writer
sb.u32_le(7744) // Our desired socket buffer size
let sbytes = Array[U8]
for bs in sb.done().values() do
sbytes.append(bs)
end
match sock.setsockopt(OSSockOpt.sol_socket(), OSSockOpt.so_rcvbuf(), sbytes)
| 0 =>
// System call was successful
| let errno: U32 =>
// System call failed
end
fun ref setsockopt( level: I32 val, option_name: I32 val, option: Array[U8 val] ref) : U32 val
Параметры
Возвращает
- U32 val
setsockopt_u32
Обработчик для сокетов UDP вызова setsockopt(2) системы, где ядро ожидает значение параметра типа C uint32_t / Pony тип U32.
Функция возвращает 0 при успехе, иначе значение errno при ошибке.
fun ref setsockopt_u32( level: I32 val, option_name: I32 val, option: U32 val) : U32 val
Параметры
Возвращает
- U32 val
get_so_error
Обработчик для вызова FFI getsockopt(fd, SOL_SOCKET, SO_ERROR, ...)
fun ref get_so_error() : (U32 val , U32 val)
Возвращает
get_so_rcvbuf
Обработчик для вызова FFI getsockopt(fd, SOL_SOCKET, SO_RCVBUF, ...)
fun ref get_so_rcvbuf() : (U32 val , U32 val)
Возвращает
get_so_sndbuf
Обёртка для вызова FFI getsockopt(fd, SOL_SOCKET, SO_SNDBUF, ...)
fun ref get_so_sndbuf() : (U32 val , U32 val)
Возвращаемое значение
set_ip_multicast_loop
Обёртка для вызова FFI setsockopt(fd, SOL_SOCKET, IP_MULTICAST_LOOP, ...)
fun ref set_ip_multicast_loop( loopback: Bool val) : U32 val
Параметры
- loopback: Булево значение
Возвращаемое значение
- U32 значение
set_ip_multicast_ttl
Обёртка для вызова FFI setsockopt(fd, SOL_SOCKET, IP_MULTICAST_TTL, ...)
fun ref set_ip_multicast_ttl( ttl: U8 val) : U32 val
Параметры
- ttl: U8 значение
Возвращаемое значение
- U32 значение
set_so_broadcast
Обёртка для вызова FFI setsockopt(fd, SOL_SOCKET, SO_BROADCAST, ...)
fun ref set_so_broadcast( state: Bool val) : U32 val
Параметры
- state: Булево значение
Возвращаемое значение
- U32 значение
set_so_rcvbuf
Обёртка для вызова FFI setsockopt(fd, SOL_SOCKET, SO_RCVBUF, ...)
fun ref set_so_rcvbuf( bufsize: U32 val) : U32 val
Параметры
- bufsize: U32 значение
Возвращаемое значение
- U32 значение
set_so_sndbuf
Обёртка для вызова FFI setsockopt(fd, SOL_SOCKET, SO_SNDBUF, ...)
fun ref set_so_sndbuf( bufsize: U32 val) : U32 val
Параметры
- bufsize: U32 значение
Возвращаемое значение
- U32 значение
© 2016-2020, The Pony Developers
© 2014-2015, Causality Ltd.
Licensed under the BSD 2-Clause License.
https://stdlib.ponylang.io/net-UDPSocket