方法
GioSocketsend_messages
自: 2.44
声明 [src]
gint
g_socket_send_messages (
GSocket* socket,
GOutputMessage* messages,
guint num_messages,
gint flags,
GCancellable* cancellable,
GError** error
)
描述 [src]
一次性从socket发送多个数据消息。这是该调用中最复杂且功能最全面的一个版本。更简易的使用方式,请参考g_socket_send(), g_socket_send_to() 和 g_socket_send_message()。
messages
必须指向一个 GOutputMessage
结构体数组和 num_messages
必须是该数组的长度。每个 GOutputMessage
包含发送数据的地址以及一个指向数组 GOutputVector
结构体的指针,该数组描述了为每个消息要发送的数据从哪里汇总的缓冲区。使用多个 GOutputVectors
比手动将数据从多个来源复制到单个缓冲区更节省内存,比多次调用 g_socket_send() 更节省网络带宽。一次性发送多个消息可以避免在需要发送大量数据包的情况下(例如,通过 RTP/UDP 进行高带宽视频流传输)或需要将相同的数据发送给多个接收者的场景中,进行大量的系统调用开销。
flags
修改消息的发送方式。此枚举中常见的参数在 GSocketMsgFlags
中可用,但该值与系统值相同,标志会按原样传递,因此你也可以传递特定于系统的标志。
如果套接字处于阻塞模式,则调用将阻塞,直到套接字队列中有足够的空间存储所有数据。如果没有可用的空间且套接字处于非阻塞模式,如果没有写入任何数据,则会返回 G_IO_ERROR_WOULD_BLOCK
错误,否则将返回发送的消息数。要等待空间可用,请等待 G_IO_OUT
条件。注意,即使你之前已经收到 G_IO_OUT
条件的提示,你仍然可能会从 g_socket_send() 收到 G_IO_ERROR_WOULD_BLOCK
。特别是在 Windows 上,这很常见,因为底层 API 的方式。
如果出错,则返回 -1 并相应设置 error
。只有在无法发送任何消息的情况下才会返回错误;否则,在错误之前成功发送的消息数将返回。
自版本 2.44 以来可用
参数
messages
-
类型: 一个
GOutputMessage
数组一个
GOutputMessage
结构体数组。数组的长度在 num_messages
参数中指定。数据由方法调用者拥有。 num_messages
-
类型:
guint
messages
中的元素数量。 flags
-
类型:
gint
包含
GSocketMsgFlags
标志的整数,可能还包含 其他平台特定的标志。 cancellable
-
类型:
GCancellable
A %GCancellable 或
NULL
。该参数可以是 NULL
。数据由方法调用者拥有。 error
-
类型:
GError **
一个可恢复错误的返回位置。
该参数可以是 NULL
。如果返回位置不是 NULL
,则必须将其初始化为NULL
GError*
。如果没有错误,方法将保留初始化到 NULL
。在出错的情况下,该参数将设置为一个新分配的 GError
;调用者将获取该数据,并负责释放它。