GioSocket

自:2.22

描述 [src]

class Gio.Socket : GObject.Object
  implements Gio.DatagramBased, Gio.Initable {
  priv: GSocketPrivate*
}

GSocket 是一种底层的网络原语。它在可移植的 GObject 基础上,对 BSD 套接字 API 进行了大致的直接映射。它支持 UNIX 套接字实现和 Windows 上的 winsock2。

GSocket 是平台无关的基础,基于它构建了更高级的网络原语。应用程序通常不会直接使用它,而是通过 GSocketClientGSocketServiceGSocketConnection 等类来使用。但在某些情况下,直接使用 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_new_from_fd

从一个原生文件描述符或Windows套接字SOCKET句柄创建一个新的GSocket

自:2.22

实例方法

g_socket_accept

在基于连接的套接字上接受传入的连接。这将从监听套接字中删除第一个未决的连接请求,并为它创建一个GSocket对象。

自:2.22

g_socket_bind

当创建套接字时,它被附加到一个地址族,但在这个族中没有地址。使用g_socket_bind()为套接字分配地址(有时也称为名称)。

自:2.22

g_socket_check_connect_result

检查并重置套接字的挂起连接错误。这用于在非阻塞模式下使用g_socket_connect()时的错误检查。

自:2.22

g_socket_close

关闭套接字,断开任何活动连接。

自:2.22

g_socket_condition_check

检查和设置套接字执行操作的准备情况。在socket上检查和屏蔽指定的condition操作,所返回的结果。

自:2.22

g_socket_condition_timed_wait

等待最多timeout_us微秒,直到在socket上的condition变为true。如果条件满足,返回TRUE

since: 2.32

g_socket_condition_wait

等待直到conditionsocket上变为true。当条件满足时,返回TRUE

自:2.22

g_socket_connect

将套接字连接到指定的远程地址。

自:2.22

g_socket_connection_factory_create_connection

socket创建正确类型的GSocketConnection子类。

自:2.22

g_socket_create_source

创建一个可附加到主context以监视套接字上特定condition的可用的GSource。这个GSource保留对socket的引用。

自:2.22

g_socket_get_available_bytes

在不阻塞的情况下获取操作系统输入缓冲区中挂起的数据量。

since: 2.32

g_socket_get_blocking

获取套接字的阻塞模式。有关阻塞I/O的详细信息,请参阅g_socket_set_blocking

自:2.22

g_socket_get_broadcast

获取套接字上的广播设置;如果为TRUE,则可以发送到广播地址的数据包。

since: 2.32

g_socket_get_credentials

返回与此套接字连接的外部进程的证书(如果有,例如,它仅支持G_SOCKET_FAMILY_UNIX套接字)。

since: 2.26

g_socket_get_family

获取套接字族。

自:2.22

g_socket_get_fd

返回底层的操作系统套接字对象。在Unix上这是一个套接字文件描述符,而在Windows上这是一个Winsock2的SOCKET句柄。这可能有助于对套接字进行平台特定或其他非常规操作。

自:2.22

g_socket_get_keepalive

获取套接字的保活模式。有关详细信息,请参阅 g_socket_set_keepalive()。

自:2.22

g_socket_get_listen_backlog

获取套接字的监听队列设置。有关详细信息,请参阅 g_socket_set_listen_backlog()。

自:2.22

g_socket_get_local_address

尝试获取已绑定套接字的本地地址。仅在套接字已显式或隐式(在连接时)绑定到本地地址时有用。

自: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_get_protocol

获取套接字创建时使用的套接字协议ID。如果协议未知,则返回-1。

自:2.22

g_socket_get_remote_address

尝试获取已连接套接字的远程地址。这仅对已连接的面向连接的套接字有用。

自:2.22

g_socket_get_socket_type

获取套接字类型。

自:2.22

g_socket_get_timeout

获取套接字的超时设置。有关详细信息,请参阅 g_socket_set_timeout()。

since: 2.26

g_socket_get_ttl

获取socket上的单播生存时间设置;有关更多详细信息,请参阅 g_socket_set_ttl()。

since: 2.32

g_socket_is_closed

检查套接字是否已关闭。

自:2.22

g_socket_is_connected

检查套接字是否已连接。这仅对面向连接的套接字有用。

自:2.22

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_listen

将套接字标记为服务器套接字,即用于使用g_socket_accept()接受传入请求的套接字。

自:2.22

g_socket_receive

从套接字接收数据(最多size字节)。这主要用于面向连接的套接字;它与将address设置为NULL的g_socket_receive_from()相同。

自:2.22

g_socket_receive_bytes

从套接字接收数据(最多size字节)。

since: 2.80

g_socket_receive_bytes_from

从套接字接收数据(最多size字节)。

since: 2.80

g_socket_receive_from

从套接字接收数据(最多size字节)。

自: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

尝试从 bufferaddress 发送 size 字节。如果 addressNULL,则消息发送到默认接收器(由 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_broadcast

设置是否允许 socket 发送到广播地址。默认值为 FALSE

since: 2.32

g_socket_set_keepalive

在底层的 socket 上设置或取消设置 SO_KEEPALIVE 标志。当此标志设置在 socket 上时,系统将尝试验证远程 socket 端点是否仍然存在,如果在较长时间内没有进行数据交换。如果系统无法验证远程端点的存在,它将自动关闭连接。

自:2.22

g_socket_set_listen_backlog

设置监听此 socket 时允许的未完成连接的最大数量。如果有比此更多的客户端正在连接到 socket 而应用程序未能及时处理,则新的连接将被拒绝。

自:2.22

g_socket_set_multicast_loopback

设置是否接收同一主机上侦听该组播地址的 socket 的发出组播数据包。默认值为 TRUE

since: 2.32

g_socket_set_multicast_ttl

设置 socket 上发出的组播数据报的有效时间。默认情况下,这为 1,意味着组播数据包不会离开本地网络。

since: 2.32

g_socket_set_option

使用与 setsockopt() 相同的方式设置 socket 上整数值选项的值。

since: 2.36

g_socket_set_timeout

设置在 socket 上的 I/O 操作超过指定时间后超时的秒数。

since: 2.26

g_socket_set_ttl

设置 socket 上发出的单播数据报的有效时间。默认情况下,使用平台特定的默认值。

since: 2.32

g_socket_shutdown

关闭全双工连接的部分或全部。

自:2.22

g_socket_speaks_ipv4

检查套接字是否能够支持IPv4。

自:2.22

GObject(43)继承的方 法。

请参阅GObject 获取方法的完整列表。

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)继承的方法
g_initable_init

初始化实现该接口的对象。

自:2.22

属性

Gio.Socket:blocking

此套接字上的I/O是否为阻塞模式。

自:2.22

Gio.Socket:broadcast

套接字是否允许将数据发送到广播地址。

since: 2.32

Gio.Socket:family

套接字的地址族。

自:2.22

Gio.Socket:fd

套接字的文件描述符。

自:2.22

Gio.Socket:keepalive

是否通过发送定期的ping来维持连接。

自:2.22

Gio.Socket:listen-backlog

侦听队列中未完成的连接数。

自:2.22

Gio.Socket:local-address

套接字绑定的本地地址。

自:2.22

Gio.Socket:multicast-loopback

是否将发出的多播数据包循环返回到本地主机。

since: 2.32

Gio.Socket:multicast-ttl

发出多播数据包的生存时间。

since: 2.32

Gio.Socket:protocol

要使用的协议的ID,或对于未知为-1。

自:2.22

Gio.Socket:remote-address

套接字连接的远程地址。

自:2.22

Gio.Socket:timeout

套接字I/O的秒数超时。

since: 2.26

Gio.Socket:ttl

发出单播数据包的生存时间。

since: 2.32

Gio.Socket:type

套接字类型。

自:2.22

信号

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 )

没有可用的描述。