接口
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_create_source
创建一个可以附加到 GMainContext
的 GSource
,以监控 GDatagramBased
上指定 condition
的可用性。该 GSource
保持对 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 |
|
父接口。 |
|
receive_messages |
|
为 g_datagram_based_receive_messages() 实现的方法。 |
|
send_messages |
|
为 g_datagram_based_send_messages() 实现的方法。 |
|
create_source |
|
为 g_datagram_based_create_source() 实现的方法。 |
|
condition_check |
|
为 g_datagram_based_condition_check() 实现的方法。 |
|
condition_wait |
|
为 g_datagram_based_condition_wait() 实现的方法。 |
虚拟方法
Gio.DatagramBased.condition_check
检查 datagram_based
执行操作是否就绪。将检查并屏蔽 condition
中指定的操作,以对抗 datagram_based
当前满足的条件。返回结果。
自:2.48
Gio.DatagramBased.create_source
创建一个可以附加到 GMainContext
的 GSource
,以监控 GDatagramBased
上指定 condition
的可用性。该 GSource
保持对 datagram_based
的引用。
自:2.48