Trait gio::prelude::SocketExtManual
source · pub trait SocketExtManual: Sized {
Show 16 methods
// Required methods
fn receive<B: AsMut<[u8]>, C: IsA<Cancellable>>(
&self,
buffer: B,
cancellable: Option<&C>
) -> Result<usize, Error>;
fn receive_from<B: AsMut<[u8]>, C: IsA<Cancellable>>(
&self,
buffer: B,
cancellable: Option<&C>
) -> Result<(usize, SocketAddress), Error>;
fn receive_message<C: IsA<Cancellable>>(
&self,
address: Option<&mut Option<SocketAddress>>,
vectors: &mut [InputVector<'_>],
control_messages: Option<&mut SocketControlMessages>,
flags: i32,
cancellable: Option<&C>
) -> Result<(usize, i32), Error>;
fn receive_messages<C: IsA<Cancellable>>(
&self,
messages: &mut [InputMessage<'_>],
flags: i32,
cancellable: Option<&C>
) -> Result<usize, Error>;
fn receive_with_blocking<B: AsMut<[u8]>, C: IsA<Cancellable>>(
&self,
buffer: B,
blocking: bool,
cancellable: Option<&C>
) -> Result<usize, Error>;
fn send<B: AsRef<[u8]>, C: IsA<Cancellable>>(
&self,
buffer: B,
cancellable: Option<&C>
) -> Result<usize, Error>;
fn send_message<P: IsA<SocketAddress>, C: IsA<Cancellable>>(
&self,
address: Option<&P>,
vectors: &[OutputVector<'_>],
messages: &[SocketControlMessage],
flags: i32,
cancellable: Option<&C>
) -> Result<usize, Error>;
fn send_message_with_timeout<P: IsA<SocketAddress>, C: IsA<Cancellable>>(
&self,
address: Option<&P>,
vectors: &[OutputVector<'_>],
messages: &[SocketControlMessage],
flags: i32,
timeout: Option<Duration>,
cancellable: Option<&C>
) -> Result<(PollableReturn, usize), Error>;
fn send_messages<C: IsA<Cancellable>>(
&self,
messages: &mut [OutputMessage<'_>],
flags: i32,
cancellable: Option<&C>
) -> Result<usize, Error>;
fn send_to<B: AsRef<[u8]>, P: IsA<SocketAddress>, C: IsA<Cancellable>>(
&self,
address: Option<&P>,
buffer: B,
cancellable: Option<&C>
) -> Result<usize, Error>;
fn send_with_blocking<B: AsRef<[u8]>, C: IsA<Cancellable>>(
&self,
buffer: B,
blocking: bool,
cancellable: Option<&C>
) -> Result<usize, Error>;
fn fd<T: FromRawFd>(&self) -> T;
fn socket<T: FromRawSocket>(&self) -> T;
fn create_source<F, C>(
&self,
condition: IOCondition,
cancellable: Option<&C>,
name: Option<&str>,
priority: Priority,
func: F
) -> Source
where F: FnMut(&Self, IOCondition) -> Continue + 'static,
C: IsA<Cancellable>;
fn create_source_future<C: IsA<Cancellable>>(
&self,
condition: IOCondition,
cancellable: Option<&C>,
priority: Priority
) -> Pin<Box<dyn Future<Output = IOCondition> + 'static>>;
fn create_source_stream<C: IsA<Cancellable>>(
&self,
condition: IOCondition,
cancellable: Option<&C>,
priority: Priority
) -> Pin<Box<dyn Stream<Item = IOCondition> + 'static>>;
}
Required Methods§
sourcefn receive<B: AsMut<[u8]>, C: IsA<Cancellable>>(
&self,
buffer: B,
cancellable: Option<&C>
) -> Result<usize, Error>
fn receive<B: AsMut<[u8]>, C: IsA<Cancellable>>( &self, buffer: B, cancellable: Option<&C> ) -> Result<usize, Error>
Receive data (up to size
bytes) from a socket. This is mainly used by
connection-oriented sockets; it is identical to SocketExtManual::receive_from()
with address
set to None
.
For SocketType::Datagram
and SocketType::Seqpacket
sockets,
SocketExtManual::receive()
will always read either 0 or 1 complete messages from
the socket. If the received message is too large to fit in buffer
, then
the data beyond size
bytes will be discarded, without any explicit
indication that this has occurred.
For SocketType::Stream
sockets, SocketExtManual::receive()
can return any
number of bytes, up to size
. If more than size
bytes have been
received, the additional data will be returned in future calls to
SocketExtManual::receive()
.
If the socket is in blocking mode the call will block until there
is some data to receive, the connection is closed, or there is an
error. If there is no data available and the socket is in
non-blocking mode, a IOErrorEnum::WouldBlock
error will be
returned. To be notified when data is available, wait for the
glib::IOCondition::IN
condition.
On error -1 is returned and error
is set accordingly.
cancellable
a GCancellable
or None
Returns
Number of bytes read, or 0 if the connection was closed by the peer, or -1 on error
buffer
a buffer to read data into (which should be at least size
bytes long).
sourcefn receive_from<B: AsMut<[u8]>, C: IsA<Cancellable>>(
&self,
buffer: B,
cancellable: Option<&C>
) -> Result<(usize, SocketAddress), Error>
fn receive_from<B: AsMut<[u8]>, C: IsA<Cancellable>>( &self, buffer: B, cancellable: Option<&C> ) -> Result<(usize, SocketAddress), Error>
Receive data (up to size
bytes) from a socket.
If address
is non-None
then address
will be set equal to the
source address of the received packet.
address
is owned by the caller.
See SocketExtManual::receive()
for additional information.
cancellable
a GCancellable
or None
Returns
Number of bytes read, or 0 if the connection was closed by the peer, or -1 on error
address
a pointer to a SocketAddress
pointer, or None
buffer
a buffer to read data into (which should be at least size
bytes long).
sourcefn receive_message<C: IsA<Cancellable>>(
&self,
address: Option<&mut Option<SocketAddress>>,
vectors: &mut [InputVector<'_>],
control_messages: Option<&mut SocketControlMessages>,
flags: i32,
cancellable: Option<&C>
) -> Result<(usize, i32), Error>
fn receive_message<C: IsA<Cancellable>>( &self, address: Option<&mut Option<SocketAddress>>, vectors: &mut [InputVector<'_>], control_messages: Option<&mut SocketControlMessages>, flags: i32, cancellable: Option<&C> ) -> Result<(usize, i32), Error>
Receive data from a socket. For receiving multiple messages, see
SocketExtManual::receive_messages()
; for easier use, see
SocketExtManual::receive()
and SocketExtManual::receive_from()
.
If address
is non-None
then address
will be set equal to the
source address of the received packet.
address
is owned by the caller.
vector
must point to an array of GInputVector
structs and
num_vectors
must be the length of this array. These structs
describe the buffers that received data will be scattered into.
If num_vectors
is -1, then vectors
is assumed to be terminated
by a GInputVector
with a None
buffer pointer.
As a special case, if num_vectors
is 0 (in which case, vectors
may of course be None
), then a single byte is received and
discarded. This is to facilitate the common practice of sending a
single ‘\0’ byte for the purposes of transferring ancillary data.
messages
, if non-None
, will be set to point to a newly-allocated
array of SocketControlMessage
instances or None
if no such
messages was received. These correspond to the control messages
received from the kernel, one SocketControlMessage
per message
from the kernel. This array is None
-terminated and must be freed
by the caller using g_free()
after calling g_object_unref()
on each
element. If messages
is None
, any control messages received will
be discarded.
num_messages
, if non-None
, will be set to the number of control
messages received.
If both messages
and num_messages
are non-None
, then
num_messages
gives the number of SocketControlMessage
instances
in messages
(ie: not including the None
terminator).
flags
is an in/out parameter. The commonly available arguments
for this are available in the GSocketMsgFlags
enum, but the
values there are the same as the system values, and the flags
are passed in as-is, so you can pass in system-specific flags too
(and SocketExtManual::receive_message()
may pass system-specific flags out).
Flags passed in to the parameter affect the receive operation; flags returned
out of it are relevant to the specific returned message.
As with SocketExtManual::receive()
, data may be discarded if self
is
SocketType::Datagram
or SocketType::Seqpacket
and you do not
provide enough buffer space to read a complete message. You can pass
G_SOCKET_MSG_PEEK
in flags
to peek at the current message without
removing it from the receive queue, but there is no portable way to find
out the length of the message other than by reading it into a
sufficiently-large buffer.
If the socket is in blocking mode the call will block until there
is some data to receive, the connection is closed, or there is an
error. If there is no data available and the socket is in
non-blocking mode, a IOErrorEnum::WouldBlock
error will be
returned. To be notified when data is available, wait for the
glib::IOCondition::IN
condition.
On error -1 is returned and error
is set accordingly.
vectors
an array of GInputVector
structs
flags
a pointer to an int containing GSocketMsgFlags
flags,
which may additionally contain
other platform specific flags
cancellable
a GCancellable
or None
Returns
Number of bytes read, or 0 if the connection was closed by the peer, or -1 on error
address
a pointer to a SocketAddress
pointer, or None
messages
a pointer
which may be filled with an array of GSocketControlMessages
, or None
sourcefn receive_messages<C: IsA<Cancellable>>(
&self,
messages: &mut [InputMessage<'_>],
flags: i32,
cancellable: Option<&C>
) -> Result<usize, Error>
fn receive_messages<C: IsA<Cancellable>>( &self, messages: &mut [InputMessage<'_>], flags: i32, cancellable: Option<&C> ) -> Result<usize, Error>
Receive multiple data messages from self
in one go. This is the most
complicated and fully-featured version of this call. For easier use, see
SocketExtManual::receive()
, SocketExtManual::receive_from()
, and SocketExtManual::receive_message()
.
messages
must point to an array of InputMessage
structs and
num_messages
must be the length of this array. Each InputMessage
contains a pointer to an array of GInputVector
structs describing the
buffers that the data received in each message will be written to. Using
multiple GInputVectors
is more memory-efficient than manually copying data
out of a single buffer to multiple sources, and more system-call-efficient
than making multiple calls to SocketExtManual::receive()
, such as in scenarios where
a lot of data packets need to be received (e.g. high-bandwidth video
streaming over RTP/UDP).
flags
modify how all messages are received. The commonly available
arguments for this are available in the GSocketMsgFlags
enum, but the
values there are the same as the system values, and the flags
are passed in as-is, so you can pass in system-specific flags too. These
flags affect the overall receive operation. Flags affecting individual
messages are returned in GInputMessage.flags
.
The other members of InputMessage
are treated as described in its
documentation.
If blocking
is true
the call will block until num_messages
have
been received, or the end of the stream is reached.
If blocking
is false
the call will return up to num_messages
without blocking, or IOErrorEnum::WouldBlock
if no messages are queued in the
operating system to be received.
In blocking mode, if timeout
is positive and is reached before any
messages are received, IOErrorEnum::TimedOut
is returned, otherwise up to
num_messages
are returned. (Note: This is effectively the
behaviour of MSG_WAITFORONE
with recvmmsg()
.)
To be notified when messages are available, wait for the
glib::IOCondition::IN
condition. Note though that you may still receive
IOErrorEnum::WouldBlock
from SocketExtManual::receive_messages()
even if you were
previously notified of a glib::IOCondition::IN
condition.
If the remote peer closes the connection, any messages queued in the
operating system will be returned, and subsequent calls to
SocketExtManual::receive_messages()
will return 0 (with no error set).
On error -1 is returned and error
is set accordingly. An error will only
be returned if zero messages could be received; otherwise the number of
messages successfully received before the error will be returned.
messages
an array of InputMessage
structs
flags
an int containing GSocketMsgFlags
flags for the overall operation,
which may additionally contain
other platform specific flags
cancellable
a GCancellable
or None
Returns
number of messages received, or -1 on error. Note that the number
of messages received may be smaller than num_messages
if in non-blocking
mode, if the peer closed the connection, or if num_messages
was larger than UIO_MAXIOV
(1024), in which case the caller may re-try
to receive the remaining messages.
sourcefn receive_with_blocking<B: AsMut<[u8]>, C: IsA<Cancellable>>(
&self,
buffer: B,
blocking: bool,
cancellable: Option<&C>
) -> Result<usize, Error>
fn receive_with_blocking<B: AsMut<[u8]>, C: IsA<Cancellable>>( &self, buffer: B, blocking: bool, cancellable: Option<&C> ) -> Result<usize, Error>
This behaves exactly the same as SocketExtManual::receive()
, except that
the choice of blocking or non-blocking behavior is determined by
the blocking
argument rather than by self
’s properties.
blocking
whether to do blocking or non-blocking I/O
cancellable
a GCancellable
or None
Returns
Number of bytes read, or 0 if the connection was closed by the peer, or -1 on error
buffer
a buffer to read data into (which should be at least size
bytes long).
sourcefn send<B: AsRef<[u8]>, C: IsA<Cancellable>>(
&self,
buffer: B,
cancellable: Option<&C>
) -> Result<usize, Error>
fn send<B: AsRef<[u8]>, C: IsA<Cancellable>>( &self, buffer: B, cancellable: Option<&C> ) -> Result<usize, Error>
Tries to send size
bytes from buffer
on the socket. This is
mainly used by connection-oriented sockets; it is identical to
SocketExtManual::send_to()
with address
set to None
.
If the socket is in blocking mode the call will block until there is
space for the data in the socket queue. If there is no space available
and the socket is in non-blocking mode a IOErrorEnum::WouldBlock
error
will be returned. To be notified when space is available, wait for the
glib::IOCondition::OUT
condition. Note though that you may still receive
IOErrorEnum::WouldBlock
from SocketExtManual::send()
even if you were previously
notified of a glib::IOCondition::OUT
condition. (On Windows in particular, this is
very common due to the way the underlying APIs work.)
On error -1 is returned and error
is set accordingly.
buffer
the buffer containing the data to send.
cancellable
a GCancellable
or None
Returns
Number of bytes written (which may be less than size
), or -1
on error
sourcefn send_message<P: IsA<SocketAddress>, C: IsA<Cancellable>>(
&self,
address: Option<&P>,
vectors: &[OutputVector<'_>],
messages: &[SocketControlMessage],
flags: i32,
cancellable: Option<&C>
) -> Result<usize, Error>
fn send_message<P: IsA<SocketAddress>, C: IsA<Cancellable>>( &self, address: Option<&P>, vectors: &[OutputVector<'_>], messages: &[SocketControlMessage], flags: i32, cancellable: Option<&C> ) -> Result<usize, Error>
Send data to address
on self
. For sending multiple messages see
SocketExtManual::send_messages()
; for easier use, see
SocketExtManual::send()
and SocketExtManual::send_to()
.
If address
is None
then the message is sent to the default receiver
(set by SocketExt::connect()
).
vectors
must point to an array of GOutputVector
structs and
num_vectors
must be the length of this array. (If num_vectors
is -1,
then vectors
is assumed to be terminated by a GOutputVector
with a
None
buffer pointer.) The GOutputVector
structs describe the buffers
that the sent data will be gathered from. Using multiple
GOutputVectors
is more memory-efficient than manually copying
data from multiple sources into a single buffer, and more
network-efficient than making multiple calls to SocketExtManual::send()
.
messages
, if non-None
, is taken to point to an array of num_messages
SocketControlMessage
instances. These correspond to the control
messages to be sent on the socket.
If num_messages
is -1 then messages
is treated as a None
-terminated
array.
flags
modify how the message is sent. The commonly available arguments
for this are available in the GSocketMsgFlags
enum, but the
values there are the same as the system values, and the flags
are passed in as-is, so you can pass in system-specific flags too.
If the socket is in blocking mode the call will block until there is
space for the data in the socket queue. If there is no space available
and the socket is in non-blocking mode a IOErrorEnum::WouldBlock
error
will be returned. To be notified when space is available, wait for the
glib::IOCondition::OUT
condition. Note though that you may still receive
IOErrorEnum::WouldBlock
from SocketExtManual::send()
even if you were previously
notified of a glib::IOCondition::OUT
condition. (On Windows in particular, this is
very common due to the way the underlying APIs work.)
The sum of the sizes of each GOutputVector
in vectors must not be
greater than G_MAXSSIZE
. If the message can be larger than this,
then it is mandatory to use the SocketExtManual::send_message_with_timeout()
function.
On error -1 is returned and error
is set accordingly.
address
a SocketAddress
, or None
vectors
an array of GOutputVector
structs
messages
a pointer to an
array of GSocketControlMessages
, or None
.
flags
an int containing GSocketMsgFlags
flags, which may additionally
contain other platform specific flags
cancellable
a GCancellable
or None
Returns
Number of bytes written (which may be less than size
), or -1
on error
sourcefn send_message_with_timeout<P: IsA<SocketAddress>, C: IsA<Cancellable>>(
&self,
address: Option<&P>,
vectors: &[OutputVector<'_>],
messages: &[SocketControlMessage],
flags: i32,
timeout: Option<Duration>,
cancellable: Option<&C>
) -> Result<(PollableReturn, usize), Error>
fn send_message_with_timeout<P: IsA<SocketAddress>, C: IsA<Cancellable>>( &self, address: Option<&P>, vectors: &[OutputVector<'_>], messages: &[SocketControlMessage], flags: i32, timeout: Option<Duration>, cancellable: Option<&C> ) -> Result<(PollableReturn, usize), Error>
v2_60
only.This behaves exactly the same as SocketExtManual::send_message()
, except that
the choice of timeout behavior is determined by the timeout_us
argument
rather than by self
’s properties.
On error PollableReturn::Failed
is returned and error
is set accordingly, or
if the socket is currently not writable PollableReturn::WouldBlock
is
returned. bytes_written
will contain 0 in both cases.
address
a SocketAddress
, or None
vectors
an array of GOutputVector
structs
messages
a pointer to an
array of GSocketControlMessages
, or None
.
flags
an int containing GSocketMsgFlags
flags, which may additionally
contain other platform specific flags
timeout_us
the maximum time (in microseconds) to wait, or -1
cancellable
a GCancellable
or None
Returns
PollableReturn::Ok
if all data was successfully written,
PollableReturn::WouldBlock
if the socket is currently not writable, or
PollableReturn::Failed
if an error happened and error
is set.
bytes_written
location to store the number of bytes that were written to the socket
sourcefn send_messages<C: IsA<Cancellable>>(
&self,
messages: &mut [OutputMessage<'_>],
flags: i32,
cancellable: Option<&C>
) -> Result<usize, Error>
fn send_messages<C: IsA<Cancellable>>( &self, messages: &mut [OutputMessage<'_>], flags: i32, cancellable: Option<&C> ) -> Result<usize, Error>
Send multiple data messages from self
in one go. This is the most
complicated and fully-featured version of this call. For easier use, see
SocketExtManual::send()
, SocketExtManual::send_to()
, and SocketExtManual::send_message()
.
messages
must point to an array of OutputMessage
structs and
num_messages
must be the length of this array. Each OutputMessage
contains an address to send the data to, and a pointer to an array of
GOutputVector
structs to describe the buffers that the data to be sent
for each message will be gathered from. Using multiple GOutputVectors
is
more memory-efficient than manually copying data from multiple sources
into a single buffer, and more network-efficient than making multiple
calls to SocketExtManual::send()
. Sending multiple messages in one go avoids the
overhead of making a lot of syscalls in scenarios where a lot of data
packets need to be sent (e.g. high-bandwidth video streaming over RTP/UDP),
or where the same data needs to be sent to multiple recipients.
flags
modify how the message is sent. The commonly available arguments
for this are available in the GSocketMsgFlags
enum, but the
values there are the same as the system values, and the flags
are passed in as-is, so you can pass in system-specific flags too.
If the socket is in blocking mode the call will block until there is
space for all the data in the socket queue. If there is no space available
and the socket is in non-blocking mode a IOErrorEnum::WouldBlock
error
will be returned if no data was written at all, otherwise the number of
messages sent will be returned. To be notified when space is available,
wait for the glib::IOCondition::OUT
condition. Note though that you may still receive
IOErrorEnum::WouldBlock
from SocketExtManual::send()
even if you were previously
notified of a glib::IOCondition::OUT
condition. (On Windows in particular, this is
very common due to the way the underlying APIs work.)
On error -1 is returned and error
is set accordingly. An error will only
be returned if zero messages could be sent; otherwise the number of messages
successfully sent before the error will be returned.
messages
an array of OutputMessage
structs
flags
an int containing GSocketMsgFlags
flags, which may additionally
contain other platform specific flags
cancellable
a GCancellable
or None
Returns
number of messages sent, or -1 on error. Note that the number of
messages sent may be smaller than num_messages
if the socket is
non-blocking or if num_messages
was larger than UIO_MAXIOV (1024),
in which case the caller may re-try to send the remaining messages.
sourcefn send_to<B: AsRef<[u8]>, P: IsA<SocketAddress>, C: IsA<Cancellable>>(
&self,
address: Option<&P>,
buffer: B,
cancellable: Option<&C>
) -> Result<usize, Error>
fn send_to<B: AsRef<[u8]>, P: IsA<SocketAddress>, C: IsA<Cancellable>>( &self, address: Option<&P>, buffer: B, cancellable: Option<&C> ) -> Result<usize, Error>
Tries to send size
bytes from buffer
to address
. If address
is
None
then the message is sent to the default receiver (set by
SocketExt::connect()
).
See SocketExtManual::send()
for additional information.
address
a SocketAddress
, or None
buffer
the buffer containing the data to send.
cancellable
a GCancellable
or None
Returns
Number of bytes written (which may be less than size
), or -1
on error
sourcefn send_with_blocking<B: AsRef<[u8]>, C: IsA<Cancellable>>(
&self,
buffer: B,
blocking: bool,
cancellable: Option<&C>
) -> Result<usize, Error>
fn send_with_blocking<B: AsRef<[u8]>, C: IsA<Cancellable>>( &self, buffer: B, blocking: bool, cancellable: Option<&C> ) -> Result<usize, Error>
This behaves exactly the same as SocketExtManual::send()
, except that
the choice of blocking or non-blocking behavior is determined by
the blocking
argument rather than by self
’s properties.
buffer
the buffer containing the data to send.
blocking
whether to do blocking or non-blocking I/O
cancellable
a GCancellable
or None
Returns
Number of bytes written (which may be less than size
), or -1
on error
sourcefn fd<T: FromRawFd>(&self) -> T
fn fd<T: FromRawFd>(&self) -> T
Returns the underlying OS socket object. On unix this is a socket file descriptor, and on Windows this is a Winsock2 SOCKET handle. This may be useful for doing platform specific or otherwise unusual operations on the socket.
Returns
the file descriptor of the socket.