方法

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;调用者将获取该数据,并负责释放它。

返回值

类型: gint

发送的消息数,或者在出错时返回 -1。请注意,如果套接字是非阻塞的或如果 num_messages 大于 UIO_MAXIOV(1024),发送的消息数可能小于 num_messages,在这种情况下,调用者可以重新尝试发送剩余的消息。