方法

GioDatagramBasedreceive_messages

since: 2.48

声明 [源代码]

gint
g_datagram_based_receive_messages (
  GDatagramBased* datagram_based,
  GInputMessage* messages,
  guint num_messages,
  gint flags,
  gint64 timeout,
  GCancellable* cancellable,
  GError** error
)

描述 [源代码]

一次性从 datagram_based 收到一个或多个数据报。

messages 必须指向一个 GInputMessage 结构体数组,而 num_messages 必须是此数组的长度。每个 GInputMessage 包含一个指向 GInputVector 结构体数组的指针,这些结构体描述了要写入每个接收到的数据报的缓冲区。

flags 修改所有消息的接收方式。此处的常用参数可以在 GSocketMsgFlags 枚举中找到,但那里的值与系统值相同,标志会原样传递,因此也可以传递特定的系统标志。这些标志影响整体接收操作。影响单个消息的标志将返回在 GInputMessage.flags 中。

GInputMessage 的其他成员处理方式请参考其文档。

如果 timeout 为负数,则调用将阻塞,直到接收到 num_messages 个消息,远程连接关闭(EOS),cancellable 被取消,或发生错误。

如果 timeout 为 0,则调用将非阻塞返回至多 num_messages 个消息,或在没有消息队列在操作系统中等待接收时返回 G_IO_ERROR_WOULD_BLOCK

如果 timeout 为正数,则调用将在相同的条件下阻塞,如果超时之前没有接收到任何消息,将返回 G_IO_ERROR_TIMED_OUT,否则它将返回在超时之前成功接收的消息数量。注意:这是 MSG_WAITFORONE 在 recvmmsg() 中的行为。

当有消息可用时,等待 G_IO_IN 条件。注意,即使您已之前通知过 G_IO_IN 条件,您仍然可能会从 g_datagram_based_receive_messages() 收到 G_IO_ERROR_WOULD_BLOCK

如果远程端关闭连接,则将返回底层数据接收缓冲区中的任何消息,后续对 g_datagram_based_receive_messages() 的调用将返回 0(没有设置错误)。

如果关闭连接或关闭(通过调用 g_socket_close()g_socket_shutdown() 并设置 shutdown_read,例如对于 GSocket),此函数的所有调用将返回 G_IO_ERROR_CLOSED

如果发生错误,则返回 -1 并设置 error。只有无法收到零个消息时才会返回错误;否则,在错误之前成功接收的消息数量将被返回。如果 cancellable 被取消,则与任何其他错误一样返回 G_IO_ERROR_CANCELLED

自 2.48 以来可用。

参数

message消息

类型: 一个GInputMessage数组的指针

一个GInputMessage结构的数组。

数组长度在num_messages参数中指定。
数据由方法的调用者拥有。
num_messages

类型: guint

messages中的元素数量。

flags

类型: gint

包含整体操作GSocketMsgFlags标志的int。

timeout

类型: gint64

最大等待时间(以微秒为单位),0表示不阻塞,-1表示无限期阻塞。

cancellable

类型: GCancellable

一个%GCancellable。

该参数可以是NULL
数据由方法的调用者拥有。
error错误

类型: GError **

可恢复错误的返回位置。

该参数可以是NULL
如果返回位置不是NULL,则必须将其初始化为一个NULLGError*
如果没有错误,方法将使参数保持NULL初始化。
如果发生错误,参数将设置为一个新的GError;调用者将获取数据的所有权,并负责释放它。

返回值

类型: gint

接收到的消息数量,或发生错误时为-1。注意,如果timeout为零或为正数,如果对等关闭连接,或者如果num_messages大于UIO_MAXIOV(1024),接收到的消息数量可能小于num_messages,在这种情况下,调用者可以重新尝试接收剩余的消息。