方法
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,则您必须将其初始化为NULLGError*。如果没有错误,方法将根据此参数初始化返回值到 NULL。出现错误时,参数将设置为一个新的分配的 GError;调用者将拥有数据,并负责释放它。