类
GioSocket
自:2.22
描述 [src]
class Gio.Socket : GObject.Object
implements Gio.DatagramBased, Gio.Initable {
priv: GSocketPrivate*
}
GSocket
是一种底层的网络原语。它在可移植的 GObject 基础上,对 BSD 套接字 API 进行了大致的直接映射。它支持 UNIX 套接字实现和 Windows 上的 winsock2。
GSocket
是平台无关的基础,基于它构建了更高级的网络原语。应用程序通常不会直接使用它,而是通过 GSocketClient
、GSocketService
和 GSocketConnection
等类来使用。但在某些情况下,直接使用 GSocket
可能非常有用。
GSocket
实现了 GInitable
接口,因此如果它通过 g_object_new()
等手动构建,则必须在使用该对象之前调用 g_initable_init()
并检查结果。这会在 g_socket_new()
和 g_socket_new_from_fd()
中自动完成,因此这些函数可以返回 NULL
。
套接字以两种一般模式操作:阻塞或非阻塞。在阻塞模式下,所有操作(未明确指定阻塞参数的操作)将阻塞,直到请求的操作完成或有错误发生。在非阻塞模式下,所有可能导致阻塞的调用将立即返回 G_IO_ERROR_WOULD_BLOCK
错误。要了解调用何时可以成功运行,可以调用 g_socket_condition_check()
或 g_socket_condition_wait()
。您还可以使用 g_socket_create_source()
并将其附加到 GMainContext
以在 I/O 可用时获得回调。请注意,所有套接字始终在系统上设置为非阻塞模式,而阻塞模式在 GSocket
中是模拟的。
在非阻塞模式下工作时,应用程序应始终能够处理获取 G_IO_ERROR_WOULD_BLOCK
错误,即使在某些其他函数声明 I/O 可用时也是如此。这种情况可能很容易发生在应用程序中的竞争条件的情况下,但也可能由其他原因引起。例如,在 Windows 上,套接字在写入返回 G_IO_ERROR_WOULD_BLOCK
之前始终被视为可写。
GSocket
可以是面向连接的,也可以是数据报基于的。对于面向连接的类型,您必须首先通过连接到地址或从一个地址接受连接来建立连接。对于无连接套接字类型,目标/源地址在每个 I/O 操作中指定或接收。
所有套接字文件描述符都被设置为在 exec
时关闭。
请注意,创建一个 GSocket
会导致程序剩余部分忽略信号 SIGPIPE
。如果您正在编写使用 GSocket
的命令行工具,您可能需要考虑到,当程序尝试在关闭后写入 stdout
时,程序不会自动被杀死。
与其他GLib中的大部分API一样,GSocket
本身不是线程安全的。要从多个线程并发使用一个GSocket
,你必须实现自己的锁机制。
Nagle算法
从GLib 2.80版本开始,GSocket
将自动为所有G_SOCKET_TYPE_STREAM
套接字设置TCP_NODELAY
选项。这禁用了Nagle算法,因为它在现代网络上通常弊大于利。
如果你的应用程序需要启用Nagle算法,请在构造GSocket
后调用g_socket_set_option()
来启用它。
socket = g_socket_new (…, G_SOCKET_TYPE_STREAM, …);
if (socket != NULL)
{
g_socket_set_option (socket, IPPROTO_TCP, TCP_NODELAY, FALSE, &local_error);
// handle error if needed
}
自版本:2.22起可用
构造函数
g_socket_new
根据指定的族、类型和协议创建一个新的GSocket
。如果protocol
为0(G_SOCKET_PROTOCOL_DEFAULT
),则使用族和类型的默认协议类型。
自:2.22
实例方法
g_socket_condition_timed_wait
等待最多timeout_us
微秒,直到在socket
上的condition
变为true。如果条件满足,返回TRUE
。
since: 2.32
g_socket_get_fd
返回底层的操作系统套接字对象。在Unix上这是一个套接字文件描述符,而在Windows上这是一个Winsock2的SOCKET
句柄。这可能有助于对套接字进行平台特定或其他非常规操作。
自:2.22
g_socket_get_multicast_loopback
获取在socket上的多播回环设置;如果为TRUE(默认值),则发送出的多播数据包将通过同一主机上的多播监听器回环。
since: 2.32
g_socket_get_multicast_ttl
获取socket上的多播生存时间设置;有关更多详细信息,请参阅 g_socket_set_multicast_ttl()。
since: 2.32
g_socket_get_option
获取socket上整数类型选项的值,类似于getsockopt()。(如果你需要检索非整数类型的选项,则需要直接调用getsockopt())。
since: 2.36
g_socket_join_multicast_group
将socket注册为接收发送到group的多播消息。socket必须是G_SOCKET_TYPE_DATAGRAM类型的套接字,并且必须使用g_socket_bind()绑定到适当的接口和端口。
since: 2.32
g_socket_join_multicast_group_ssm
将socket注册为接收发送到group的多播消息。socket必须是G_SOCKET_TYPE_DATAGRAM类型的套接字,并且必须使用g_socket_bind()绑定到适当的接口和端口。
since: 2.56
g_socket_leave_multicast_group
从由group、iface和source_specific(它们都必须与您加入组时具有相同的值)定义的多播组中删除socket。
since: 2.32
g_socket_leave_multicast_group_ssm
从由group、iface和source_specific(它们都必须与您加入组时具有相同的值)定义的多播组中删除socket。
since: 2.56
g_socket_receive
从套接字接收数据(最多size字节)。这主要用于面向连接的套接字;它与将address设置为NULL的g_socket_receive_from()相同。
自:2.22
g_socket_receive_message
从套接字接收数据。要接收多个消息,请参阅g_socket_receive_messages();为了更方便地使用,请参阅g_socket_receive()和g_socket_receive_from()。
自:2.22
g_socket_receive_messages
一次从socket接收多个数据消息。这是此调用中功能最复杂、功能最全面的版本。为了更方便地使用,请参阅g_socket_receive()、g_socket_receive_from()和g_socket_receive_message()。
since: 2.48
g_socket_receive_with_blocking
此函数的行为与 g_socket_receive() 完全相同,区别在于阻塞或非阻塞行为由 blocking
参数决定,而不是由 socket
的属性决定。
since: 2.26
g_socket_send
尝试从 buffer
向 socket 发送 size
字节。这主要用于面向连接的 socket;它与将 address
设置为 NULL
时的 g_socket_send_to()}
相同。
自:2.22
g_socket_send_message
向 socket
上的 address
发送数据。对于发送多个消息,请参阅 g_socket_send_messages(); 为了便于使用,请参阅 g_socket_send()
和 g_socket_send_to()。
自:2.22
g_socket_send_message_with_timeout
此函数行为与 g_socket_send_message() 完全相同,区别在于超时行为的决定因素是 timeout_us
参数,而不是 socket
的属性。
since: 2.60
g_socket_send_messages
一次向 socket 发送多个数据消息。这是此调用最复杂且功能最齐全的版本。为了便于使用,请参阅 g_socket_send()、g_socket_send_to() 和 g_socket_send_message()。
since: 2.44
g_socket_send_to
尝试从 buffer
向 address
发送 size
字节。如果 address
是 NULL
,则消息发送到默认接收器(由 g_socket_connect() 设置)。
自:2.22
g_socket_send_with_blocking
此函数行为与 g_socket_send() 完全相同,区别在于阻塞或非阻塞行为的决定因素是 blocking
参数,而不是 socket
的属性。
since: 2.26
g_socket_set_blocking
设置 socket 的阻塞模式。在阻塞模式下,所有操作(不带明确的阻塞参数的操作)将阻塞,直到成功或出现错误。在非阻塞模式下,所有函数将立即返回结果或返回带有 G_IO_ERROR_WOULD_BLOCK
错误的结果。
自:2.22
g_socket_set_keepalive
在底层的 socket 上设置或取消设置 SO_KEEPALIVE
标志。当此标志设置在 socket 上时,系统将尝试验证远程 socket 端点是否仍然存在,如果在较长时间内没有进行数据交换。如果系统无法验证远程端点的存在,它将自动关闭连接。
自:2.22
g_socket_set_listen_backlog
设置监听此 socket 时允许的未完成连接的最大数量。如果有比此更多的客户端正在连接到 socket 而应用程序未能及时处理,则新的连接将被拒绝。
自:2.22
从GDatagramBased(5)继承的方法。
g_datagram_based_condition_check
检查datagram_based的运行准备情况。在condition中指定的操作将被检查,并与其他datagram_based当前满足的条件进行比较。返回结果。
since: 2.48
g_datagram_based_condition_wait
等待至多timeout
微秒,直到datagram_based的条件变为true。如果条件满足,返回TRUE
。
since: 2.48
g_datagram_based_create_source
创建一个可附加到GMainContext的GSource
,以监控GDatagramBased上指定condition
的可用性。《GSource》会保留对datagram_based
的引用。
since: 2.48
g_datagram_based_receive_messages
一次性从datagram_based接收一个或多个数据消息。
since: 2.48
g_datagram_based_send_messages
一次性从datagram_based发送一个或多个数据消息。
since: 2.48
从GInitable(1)继承的方法
信号
从GObject(1)继承的信号。
GObject::notify
当通过g_object_set_property()、g_object_set()等设置对象的一个属性值时,会发出notify信号。
类结构
struct GioSocketClass {
GObjectClass parent_class;
void (* _g_reserved1) (
void
);
void (* _g_reserved2) (
void
);
void (* _g_reserved3) (
void
);
void (* _g_reserved4) (
void
);
void (* _g_reserved5) (
void
);
void (* _g_reserved6) (
void
);
void (* _g_reserved7) (
void
);
void (* _g_reserved8) (
void
);
void (* _g_reserved9) (
void
);
void (* _g_reserved10) (
void
);
}
没有可用的描述。
类成员
parent_class: GObjectClass
没有可用的描述。
_g_reserved1: void (* _g_reserved1) ( void )
没有可用的描述。
_g_reserved2: void (* _g_reserved2) ( void )
没有可用的描述。
_g_reserved3: void (* _g_reserved3) ( void )
没有可用的描述。
_g_reserved4: void (* _g_reserved4) ( void )
没有可用的描述。
_g_reserved5: void (* _g_reserved5) ( void )
没有可用的描述。
_g_reserved6: void (* _g_reserved6) ( void )
没有可用的描述。
_g_reserved7: void (* _g_reserved7) ( void )
没有可用的描述。
_g_reserved8: void (* _g_reserved8) ( void )
没有可用的描述。
_g_reserved9: void (* _g_reserved9) ( void )
没有可用的描述。
_g_reserved10: void (* _g_reserved10) ( void )
没有可用的描述。