接口

GioDatagramBased

自:2.48

描述 [源]

interface Gio.DatagramBased : GObject.Object

提供类似于套接字对象的报文语义的接口。

GDatagramBased 是用于表示基于报文的通信的网络接口。它基本上是将 BSD 套接字 API 的核心部分映射到一个可移植的 GObject 接口。它由 GSocket 实现,该接口在 UNIX 上包装了 UNIX 套接字 API,在 Windows 上则是 winsock2。

GDatagramBased 完全与平台无关,旨在与更高层级的网络 API(如 GIOStream)一起使用。

默认情况下使用向量分散/集中 I/O,允许在单次调用中发送或接收多个消息。在可能的情况下,接口的实现应利用向量 I/O 来最小化处理或系统调用。例如,GSocket 在可能的情况下使用 recvmmsg()sendmmsg()。调用者应利用分散/集中 I/O(每个消息使用多个缓冲区)来避免不必要的数据复制来组装或解组装消息。

每个 GDatagramBased 操作都有一个超时参数,可能是负值表示阻塞行为,零表示非阻塞行为,或正值表示超时行为。阻塞操作会阻塞,直到完成或出现错误。非阻塞操作如果无法取得进展,将立即返回并带有一个 G_IO_ERROR_WOULD_BLOCK 错误。超时操作会阻塞,直到操作完成或超时到期;如果超时到期,它将返回已取得的进展,如果没有任何进展,将返回 G_IO_ERROR_TIMED_OUT。要了解何时可以成功调用,你可以调用 g_datagram_based_condition_check()g_datagram_based_condition_wait()。你也可以使用 g_datagram_based_create_source() 并将其附加到一个 GMainContext 上,以在 I/O 可用时接收回调。

当运行非阻塞操作时,应用程序应该始终能够处理获取 G_IO_ERROR_WOULD_BLOCK 错误的情况,即使某些其他函数表明 I/O 是可能的。这种情况可能由于应用程序中的竞争条件而发生,但也可能由于其他原因发生。例如,在 Windows 上,套接字总是被视为可写的,直到写入操作返回 G_IO_ERROR_WOULD_BLOCK

GSocket 类似,GDatagramBased 可以为面向连接(例如,SCTP)或无连接(例如,UDP)。 GDatagramBased 必须是无连接的,不能是流式的。该接口不涵盖连接建立,在使用 GDatagramBased API 发送和接收数据之前,请使用底层类型的方法建立连接。对于无连接套接字类型,目标/源地址在每个 I/O 操作中指定或接收。

与其他 GLib 中的大多数其他 API 一样,GDatagramBased 本身不是线程安全的。要多个线程并发使用 GDatagramBased,您必须实现自己的锁。

自 2.48 版本起可用

前提

要实现 DatagramBased,您的类型必须继承自GObject.

实现

实例方法

g_datagram_based_condition_check

检查 datagram_based 执行操作是否就绪。将检查并屏蔽 condition 中指定的操作,以对抗 datagram_based 当前满足的条件。返回结果。

自:2.48

g_datagram_based_condition_wait

等待最多 timeout 微秒,直到 datagram_based 上的条件变为真。如果满足条件,返回 TRUE

自:2.48

g_datagram_based_create_source

创建一个可以附加到 GMainContextGSource,以监控 GDatagramBased 上指定 condition 的可用性。该 GSource 保持对 datagram_based 的引用。

自:2.48

g_datagram_based_receive_messages

一次性从 datagram_based 接收一个或多个数据消息。

自:2.48

g_datagram_based_send_messages

一次性从 datagram_based 发送一个或多个数据消息。

自:2.48

接口结构

struct GioDatagramBasedInterface {
  GTypeInterface g_iface;
  gint (* receive_messages) (
    GDatagramBased* datagram_based,
    GInputMessage* messages,
    guint num_messages,
    gint flags,
    gint64 timeout,
    GCancellable* cancellable,
    GError** error
  );
  gint (* send_messages) (
    GDatagramBased* datagram_based,
    GOutputMessage* messages,
    guint num_messages,
    gint flags,
    gint64 timeout,
    GCancellable* cancellable,
    GError** error
  );
  GSource* (* create_source) (
    GDatagramBased* datagram_based,
    GIOCondition condition,
    GCancellable* cancellable
  );
  GIOCondition (* condition_check) (
    GDatagramBased* datagram_based,
    GIOCondition condition
  );
  gboolean (* condition_wait) (
    GDatagramBased* datagram_based,
    GIOCondition condition,
    gint64 timeout,
    GCancellable* cancellable,
    GError** error
  );
  
}

为具有数据报语义的类似套接字对象提供一个接口,遵循伯克利套接字 API。接口方法是对相应虚拟方法的薄包装,没有实现输入预处理 - 因此此 API 的实现必须处理接口方法中记录的所有功能。

接口成员
g_iface
GTypeInterface
 

父接口。

receive_messages
gint (* receive_messages) (
    GDatagramBased* datagram_based,
    GInputMessage* messages,
    guint num_messages,
    gint flags,
    gint64 timeout,
    GCancellable* cancellable,
    GError** error
  )
 

为 g_datagram_based_receive_messages() 实现的方法。

send_messages
gint (* send_messages) (
    GDatagramBased* datagram_based,
    GOutputMessage* messages,
    guint num_messages,
    gint flags,
    gint64 timeout,
    GCancellable* cancellable,
    GError** error
  )
 

为 g_datagram_based_send_messages() 实现的方法。

create_source
GSource* (* create_source) (
    GDatagramBased* datagram_based,
    GIOCondition condition,
    GCancellable* cancellable
  )
 

为 g_datagram_based_create_source() 实现的方法。

condition_check
GIOCondition (* condition_check) (
    GDatagramBased* datagram_based,
    GIOCondition condition
  )
 

为 g_datagram_based_condition_check() 实现的方法。

condition_wait
gboolean (* condition_wait) (
    GDatagramBased* datagram_based,
    GIOCondition condition,
    gint64 timeout,
    GCancellable* cancellable,
    GError** error
  )
 

为 g_datagram_based_condition_wait() 实现的方法。

虚拟方法

Gio.DatagramBased.condition_check

检查 datagram_based 执行操作是否就绪。将检查并屏蔽 condition 中指定的操作,以对抗 datagram_based 当前满足的条件。返回结果。

自:2.48

Gio.DatagramBased.condition_wait

等待最多 timeout 微秒,直到 datagram_based 上的条件变为真。如果满足条件,返回 TRUE

自:2.48

Gio.DatagramBased.create_source

创建一个可以附加到 GMainContextGSource,以监控 GDatagramBased 上指定 condition 的可用性。该 GSource 保持对 datagram_based 的引用。

自:2.48

Gio.DatagramBased.receive_messages

一次性从 datagram_based 接收一个或多个数据消息。

自:2.48

Gio.DatagramBased.send_messages

一次性从 datagram_based 发送一个或多个数据消息。

自:2.48