module Gio::DatagramBased
Overview
Interface for socket-like objects with datagram semantics.
A GDatagramBased is a networking interface for representing datagram-based
communications. It is a more or less direct mapping of the core parts of the
BSD socket API in a portable GObject interface. It is implemented by
Gio::Socket, which wraps the UNIX socket API on UNIX and winsock2 on Windows.
GDatagramBased is entirely platform independent, and is intended to be used
alongside higher-level networking APIs such as Gio::IOStream.
It uses vectored scatter/gather I/O by default, allowing for many messages
to be sent or received in a single call. Where possible, implementations of
the interface should take advantage of vectored I/O to minimise processing
or system calls. For example, GSocket uses recvmmsg() and sendmmsg()
where possible. Callers should take advantage of scatter/gather I/O (the use of
multiple buffers per message) to avoid unnecessary copying of data to
assemble or disassemble a message.
Each GDatagramBased operation has a timeout parameter which may be negative
for blocking behaviour, zero for non-blocking behaviour, or positive for
timeout behaviour. A blocking operation blocks until finished or there is an
error. A non-blocking operation will return immediately with a
G_IO_ERROR_WOULD_BLOCK error if it cannot make progress. A timeout operation
will block until the operation is complete or the timeout expires; if the
timeout expires it will return what progress it made, or
G_IO_ERROR_TIMED_OUT if no progress was made. To know when a call would
successfully run you can call Gio::DatagramBased#condition_check or
Gio::DatagramBased#condition_wait. You can also use
Gio::DatagramBased#create_source and attach it to a GLib::MainContext
to get callbacks when I/O is possible.
When running a non-blocking operation applications should always be able to
handle getting a G_IO_ERROR_WOULD_BLOCK error even when some other function
said that I/O was possible. This can easily happen in case of a race
condition in the application, but it can also happen for other reasons. For
instance, on Windows a socket is always seen as writable until a write
returns G_IO_ERROR_WOULD_BLOCK.
As with GSocket, GDatagramBaseds can be either connection oriented (for
example, SCTP) or connectionless (for example, UDP). GDatagramBaseds must be
datagram-based, not stream-based. The interface does not cover connection
establishment — use methods on the underlying type to establish a connection
before sending and receiving data through the GDatagramBased API. For
connectionless socket types the target/source address is specified or
received in each I/O operation.
Like most other APIs in GLib, GDatagramBased is not inherently thread safe.
To use a GDatagramBased concurrently from multiple threads, you must
implement your own locking.
Direct including types
Defined in:
lib/gi-crystal/src/auto/gio-2.0/datagram_based.crConstructors
-
.cast(obj : GObject::Object) : self
Cast a
GObject::Objecttoself, throws aTypeCastErrorif the cast can't be made.
Class Method Summary
Instance Method Summary
- #condition_check(condition : GLib::IOCondition) : GLib::IOCondition
- #condition_wait(condition : GLib::IOCondition, timeout : Int64, cancellable : Gio::Cancellable | Nil) : Bool
- #create_source(condition : GLib::IOCondition, cancellable : Gio::Cancellable | Nil) : GLib::Source
- #receive_messages(messages : Enumerable(Gio::InputMessage), flags : Int32, timeout : Int64, cancellable : Gio::Cancellable | Nil) : Int32
- #send_messages(messages : Enumerable(Gio::OutputMessage), flags : Int32, timeout : Int64, cancellable : Gio::Cancellable | Nil) : Int32
- #to_unsafe