方法
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
;调用者将拥有数据,并负责释放它。