Spec-Zone.ru › Pony

UDPSocket

[Source]

Создаёт сокет 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

[Source]

Прослушивает как 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

[Source]

Прослушивает 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

[Source]

Прослушивает 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

[Source]

Записать последовательность байтов.

be write(
  data: (String val | Array[U8 val] val),
  to: NetAddress val)

Параметры

  • data: (String val | Array[U8 val] val)
  • to: NetAddress val

writev

[Source]

Записать последовательность последовательностей байтов.

be writev(
  data: ByteSeqIter val,
  to: NetAddress val)

Параметры

  • data: ByteSeqIter val
  • to: NetAddress val

set_notify

[Source]

Изменить уведомление.

be set_notify(
  notify: UDPNotify iso)

Параметры

  • notify: UDPNotify iso

set_broadcast

[Source]

Включить или выключить возможность передачи данных в режиме широковещания с данного сокета.

be set_broadcast(
  state: Bool val)

Параметры

  • state: Bool val

set_multicast_interface

[Source]

По умолчанию ОС выбирает адрес для отправки пакетов, предназначенных для многоадресной рассылки. Это можно использовать для принудительного выбора определённого интерфейса. Для возвращения к выбору ОС, вызовите с пустой строкой.

be set_multicast_interface(
  from: String val = "")

Параметры

  • from: String val = ""

set_multicast_loopback

[Source]

По умолчанию пакеты, отправленные на многоадресную группу, будут получены отправляющей системой, если она подписана на эту группу. Отключение loopback предотвращает это.

be set_multicast_loopback(
  loopback: Bool val)

Параметры

  • loopback: Bool val

set_multicast_ttl

[Source]

Установить TTL для многоадресной рассылки. По умолчанию 1.

be set_multicast_ttl(
  ttl: U8 val)

Параметры

  • ttl: U8 val

multicast_join

[Source]

Добавить многоадресную группу. Это может быть ограничено пакетами, поступающими на определённый интерфейс.

be multicast_join(
  group: String val,
  to: String val = "")

Параметры

  • group: String val
  • to: String val = ""

multicast_leave

[Source]

Удалить многоадресную группу. Это может быть ограничено пакетами, поступающими на определённый интерфейс. Не предпринимается попыток проверить, добавлял ли этот сокет эту группу ранее.

be multicast_leave(
  group: String val,
  to: String val = "")

Параметры

  • group: String val
  • to: String val = ""

dispose

[Source]

Остановить прослушивание.

be dispose()

Публичные функции

local_address

[Source]

Возвращает привязанный IP-адрес.

fun box local_address()
: NetAddress val

Возвращает

  • NetAddress val

getsockopt

[Source]

Общий обработчик для сокетов 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^)

Параметры

  • level: I32 val
  • option_name: I32 val
  • option_max_size: USize val = 4

Возвращает

  • (U32 val , Array[U8 val] iso^)

getsockopt_u32

[Source]

Обработчик для сокетов 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)

Параметры

  • level: I32 val
  • option_name: I32 val

Возвращает

  • (U32 val , U32 val)

setsockopt

[Source]

Общий обработчик для сокетов 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

Параметры

  • level: I32 val
  • option_name: I32 val
  • option: Array[U8 val] ref

Возвращает

  • U32 val

setsockopt_u32

[Source]

Обработчик для сокетов 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

Параметры

  • level: I32 val
  • option_name: I32 val
  • option: U32 val

Возвращает

  • U32 val

get_so_error

[Source]

Обработчик для вызова FFI getsockopt(fd, SOL_SOCKET, SO_ERROR, ...)

fun ref get_so_error()
: (U32 val , U32 val)

Возвращает

  • (U32 val , U32 val)

get_so_rcvbuf

[Source]

Обработчик для вызова FFI getsockopt(fd, SOL_SOCKET, SO_RCVBUF, ...)

fun ref get_so_rcvbuf()
: (U32 val , U32 val)

Возвращает

  • (U32 значение , U32 значение)

get_so_sndbuf

[Источник]

Обёртка для вызова FFI getsockopt(fd, SOL_SOCKET, SO_SNDBUF, ...)

fun ref get_so_sndbuf()
: (U32 val , U32 val)

Возвращаемое значение

  • (U32 значение , U32 значение)

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API