connected_udp_backend.pony

trait ref ConnectedUDPBackend
  """
  The operations a connected UDP socket needs from the runtime. Overlaps with
  `UDPBackend` for bind and receive; adds connect and send for connected-mode
  I/O. `ConnectedUDPRuntimeBackend` is the production implementation. Test
  code can substitute a fake that implements only this trait.
  """
  new create()

  fun ref bind(the_actor: AsioEventNotify,
    host: String,
    port: String,
    ip_version: IPVersion = DualStack)
    : AsioEventID
    """
    Bind a UDP socket to `host`:`port` and subscribe `the_actor` for
    readiness events. Returns the ASIO event, or a null event on failure.
    """

  fun ref connect(fd: U32,
    host: String,
    port: String,
    ip_version: IPVersion = DualStack)
    : Bool
    """
    Set the default peer address on an already-bound UDP socket. Returns
    true on success.
    """

  fun ref close(fd: U32)
    """
    Close the socket.
    """

  fun ref recvfrom(event: AsioEventID,
    buffer: Pointer[U8] tag,
    size: USize)
    : (SocketResult, USize, NetAddress iso^)
    """
    Receive one datagram into `buffer`. Returns the tri-state socket result,
    the number of bytes received, and the sender address.
    """

  fun ref send(fd: U32,
    data: ByteSeq)
    : SocketResult
    """
    Send one datagram to the connected peer. Returns `SocketResultOk` on
    success, `SocketResultRetry` when the OS buffer is full, or
    `SocketResultError` on failure.
    """

  fun ref sockname(fd: U32, ip: NetAddress tag): Bool
    """
    Fill `ip` with the local address of `fd`. Returns true on success.
    """

  fun ref peername(fd: U32, ip: NetAddress tag): Bool
    """
    Fill `ip` with the remote peer address of `fd`. Returns true on success.
    """