虚拟方法

GioDatagramBasedreceive_messages

自从:2.48

声明 [源]

gint
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 为正数,则调用将在与 timeout 为负数时相同的条件下阻塞。如果在收到任何消息之前超时,则返回 G_IO_ERROR_TIMED_OUT,否则在超时前返回收到的消息数量。(注意:这是 recvmmsg() 上 MSG_WAITFORONE 的有效行为。)

要获得消息可用时通知,等待 G_IO_IN 条件。不过请注意,即使您之前已经通知了 G_IO_IN 条件,g_datagram_based_receive_messages() 也可能从返回 G_IO_ERROR_WOULD_BLOCK

如果远程对等方关闭了连接,则底层的接收缓冲区中的所有排队消息都将返回,并且随后的 g_datagram_based_receive_messages() 调用将返回0(不设置错误)。

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

在错误情况下返回 -1 并相应地设置 error。只有在无法接收消息的情况下才会返回错误;否则,将在错误之前返回成功接收的消息数。如果 cancellable 被取消,则与其他任何错误一样返回 G_IO_ERROR_CANCELLED

自 2.48 以来提供

参数

messages

类型:一个 GInputMessage 数组

GInputMessage 结构体的数组。

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

类型: guint

messages 中的元素数量。

flags

类型: gint

一个包含整体操作 GSocketMsgFlags 标志的整型。

timeout

类型: gint64

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

cancellable

类型: GCancellable

%GCancellable。

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

类型: GError **

恢复错误的位置的返回位置

参数可以是 NULL
如果返回位置不是 NULL,那么您必须将其初始化为 NULL GError*
如果没有错误,则虚拟函数将使该参数保留初始化为 NULL
在出现错误的情况下,该参数将被设置为一个新分配的 GError;调用者将获取数据的所有权,并负责释放它。

返回值

类型: gint

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