方法

GioSocketreceive_messages

since: 2.48

声明 [src]

gint
g_socket_receive_messages (
  GSocket* socket,
  GInputMessage* messages,
  guint num_messages,
  gint flags,
  GCancellable* cancellable,
  GError** error
)

描述 [src]

一次性从 socket 接收多个数据消息。这是此调用最复杂、功能最全的版本。为了更易于使用,请参阅 g_socket_receive()、g_socket_receive_from() 和 g_socket_receive_message()。

messages 必须指向一个 GInputMessage 结构体的数组,而 num_messages 必须是此数组的长度。每个 GInputMessage 都包含一个指向用于写入每个消息接收到的数据的 GInputVector 结构体数组的指针。使用多个 GInputVectors 比手动将数据从单个缓冲区复制到多个源更节省内存,而且在需要接收大量数据包的情况下(例如,通过 RTP/UDP 的高带宽视频流)也比多次调用 g_socket_receive() 更高效。

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

GInputMessage 的其他成员的解释请参考其文档。

如果 GSocket:blocking 设置为 TRUE,则调用将阻塞,直到接收到 num_messages 后,或达到流结束的位置。

如果 GSocket:blocking 设置为 FALSE,则调用将返回不超过 num_messages 的消息而不会阻塞,如果没有在操作系统队列中准备好要接收的消息,则返回 G_IO_ERROR_WOULD_BLOCK

在阻塞模式下,如果 GSocket:timeout 为正数,并且在接收到任何消息之前到达,将返回 G_IO_ERROR_TIMED_OUT,否则将返回最多 num_messages。注:这实际上是 recvmmsg() 中 MSG_WAITFORONE 的行为。

要通知消息可用,请等待 G_IO_IN 条件。请注意,即使您已经之前收到了 G_IO_IN 条件的通告,仍然可能从 g_socket_receive_messages() 收到 G_IO_ERROR_WOULD_BLOCK

如果远程对端关闭了连接,操作系统队列中的任何消息都将被返回,并且后续对 g_socket_receive_messages() 的调用将返回 0(不设置任何错误)。

在错误情况下,返回 -1 并将 error 设置为相应的值。只有在无法接收任何消息的情况下才会返回错误;否则,会在错误之前返回成功接收的消息数量。

自 2.48 以来可用。

参数

messages

类型: 一个 GInputMessage 数组

一个 GInputMessage 结构体数组。

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

类型: guint

数组 messages 中元素的数量。

flags

类型: gint

包含整体操作的 GSocketMsgFlags 标志的整数值,可能还包含其他平台特定的标志。

cancellable

类型: GCancellable

一个 %GCancellable 或 NULL

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

类型: GError **

可恢复错误 返回的位置。

此参数可以是 NULL
如果返回位置不为 NULL,则您必须将其初始化为 NULL GError*
如果没有错误,方法将根据此参数初始化返回值到 NULL
出现错误时,参数将设置为一个新的分配的 GError;调用者将拥有数据,并负责释放它。

返回值

类型: gint

接收到的消息数量,错误时返回-1。注意,在非阻塞模式、对方关闭连接或 num_messages 大于 UIO_MAXIOV(1024)的情况下,接收到的消息数可能小于 num_messages。在这种情况下,调用者可以尝试重新接收剩余的消息。