ENetConnection

继承: RefCounted < Object

ENetHost 的包装类。

描述

ENet 的目的是在 UDP(用户数据报协议)之上,提供一个相对轻便、简单和健壮的网络通信层。

方法

void

bandwidth_limit(in_bandwidth: int = 0, out_bandwidth: int = 0)

void

broadcast(channel: int, packet: PackedByteArray, flags: int)

void

channel_limit(limit: int)

void

compress(mode: CompressionMode)

ENetPacketPeer

connect_to_host(address: String, port: int, channels: int = 0, data: int = 0)

Error

create_host(max_peers: int = 32, max_channels: int = 0, in_bandwidth: int = 0, out_bandwidth: int = 0)

Error

create_host_bound(bind_address: String, bind_port: int, max_peers: int = 32, max_channels: int = 0, in_bandwidth: int = 0, out_bandwidth: int = 0)

void

destroy()

Error

dtls_client_setup(hostname: String, client_options: TLSOptions = null)

Error

dtls_server_setup(server_options: TLSOptions)

void

flush()

int

get_local_port() const

int

get_max_channels() const

Array[ENetPacketPeer]

get_peers()

float

pop_statistic(statistic: HostStatistic)

void

refuse_new_connections(refuse: bool)

Array

service(timeout: int = 0)

void

socket_send(destination_address: String, destination_port: int, packet: PackedByteArray)


枚举

enum CompressionMode: 🔗

CompressionMode COMPRESS_NONE = 0

无压缩。这使用最多的带宽,但具有占用最少 CPU 资源的好处。这个选项可以用于 Wireshark 等工具使用,更容易进行网络调试。

CompressionMode COMPRESS_RANGE_CODER = 1

ENet 的内置范围编码。适用于小数据包,但对于大于 4 KB 的数据包不是最有效的算法。

CompressionMode COMPRESS_FASTLZ = 2

FastLZ 压缩。与 COMPRESS_ZLIB 相比,此选项使用的 CPU 资源更少,代价是使用更多的带宽。

CompressionMode COMPRESS_ZLIB = 3

Zlib 压缩。与 COMPRESS_FASTLZ 相比,此选项使用的带宽更少,代价是使用更多的 CPU 资源。

CompressionMode COMPRESS_ZSTD = 4

Zstandard 压缩。请注意,此算法对小于 4 KB 的数据包效率不高。因此,建议在大多数情况下使用其他压缩算法。


enum EventType: 🔗

EventType EVENT_ERROR = -1

service() 期间发生错误。你可能需要 destroy() 主机并重新创建。

EventType EVENT_NONE = 0

在指定的时间限制内没有事件发生。

EventType EVENT_CONNECT = 1

由 enet_host_connect 发起的连接请求已完成。该数组将包含成功连接的对等体。

EventType EVENT_DISCONNECT = 2

对等体已断开连接。如果对等体超时,或者由 connect_to_host() 初始化的连接请求超时,则在由 ENetPacketPeer.peer_disconnect() 发起的断开连接成功完成时,生成该事件。该数组将包含断开连接的对等体。数据字段包含用户提供的描述断开连接的数据,如果没有可用的数据,则为 0。

EventType EVENT_RECEIVE = 3

已从对等体接收到一个数据包。该数组将包含发送数据包的对等体和接收数据包的通道号。接收到的数据包将被排队到关联的 ENetPacketPeer


enum HostStatistic: 🔗

HostStatistic HOST_TOTAL_SENT_DATA = 0

发送数据的总数。

HostStatistic HOST_TOTAL_SENT_PACKETS = 1

发送 UDP 数据包的总数。

HostStatistic HOST_TOTAL_RECEIVED_DATA = 2

接收数据的总数。

HostStatistic HOST_TOTAL_RECEIVED_PACKETS = 3

接收 UDP 数据包的总数。


方法说明

void bandwidth_limit(in_bandwidth: int = 0, out_bandwidth: int = 0) 🔗

调整主机的带宽限制。


void broadcast(channel: int, packet: PackedByteArray, flags: int) 🔗

将一个 packet 加入队列,以便将其通过指定的 channel 发送到与主机关联的所有对等体。请参阅 ENetPacketPeer 中的 FLAG_* 常量以了解可用的数据包标志。


void channel_limit(limit: int) 🔗

限制未来传入连接的最大允许通道数。


void compress(mode: CompressionMode) 🔗

设置用于网络数据包的压缩方法。这些方法在压缩速度与带宽之间的平衡有所不同,如果您使用压缩功能,可能需要测试哪种方法最适合您的应用场景。

注意: 大多数应用的网络设计会频繁发送许多较小的数据包(每个数据包的大小小于 4KB)。如有疑问,建议保持默认的压缩算法,因为这种算法在处理这些较小的数据包时效果最佳。

注意: 服务器和其所有客户端上的压缩模式必须设置为相同的值。如果客户端设置的压缩模式与服务器设置的不一致,客户端将无法连接。


ENetPacketPeer connect_to_host(address: String, port: int, channels: int = 0, data: int = 0) 🔗

使用指定的 port 与远程 address 建立连接,并分配所需 channels 。在连接过程中,还可以以 32 位整数的形式传递可选 data

注意: 在调用此方法之前,必须在两端分别调用 create_host()create_host_bound()


Error create_host(max_peers: int = 32, max_channels: int = 0, in_bandwidth: int = 0, out_bandwidth: int = 0) 🔗

创建一个 ENetHost 对象,该对象最多可支持 max_peers 个连接的客户端,每个客户端最多可分配 max_channels 个通道。此外,还可以选择将带宽限制为 in_bandwidthout_bandwidth (如果这两个值大于零的话)。

此方法会在主机上绑定一个地址为 unspecified 的随机可用的动态 UDP 端口。要指定地址和端口,请使用 create_host_bound()

注意: 为了建立连接,客户端和服务器端都需要先创建一个主机。


Error create_host_bound(bind_address: String, bind_port: int, max_peers: int = 32, max_channels: int = 0, in_bandwidth: int = 0, out_bandwidth: int = 0) 🔗

创建一个与给定的 bind_addressbind_port 绑定的 ENetHost 实例,该实例最多可支持 max_peers 个连接的客户端,每个客户端最多可分配 max_channels 个通道,并可选择性地限制带宽为 in_bandwidthout_bandwidth (如果大于零)。

注意: 要建立连接,必须在客户端和服务器端都创建一个主机。


void destroy() 🔗

销毁主机和与其关联的所有资源。


Error dtls_client_setup(hostname: String, client_options: TLSOptions = null) 🔗

配置此 ENetHost 以使用允许对 ENet 客户端进行 DTLS 加密的自定义 i3D 扩展。在 connect_to_host() 之前调用它,让 ENet 连接使用 DTLS 根据 hostname 验证服务器证书。可以通过可选的 client_options 参数来自定义受信任的证书颁发机构,或禁用通用名称验证。见 TLSOptions.client()TLSOptions.client_unsafe()


Error dtls_server_setup(server_options: TLSOptions) 🔗

配置该 ENetHost 以使用允许对 ENet 服务器进行 DTLS 加密的自定义 i3D 扩展。在 create_host_bound() 之后立即调用该方法,以让 ENet 期望对等体使用 DTLS 进行连接。请参阅 TLSOptions.server()


void flush() 🔗

将指定主机上所有被队列的数据包发送到其指定的对等体。


int get_local_port() const 🔗

返回此对等点绑定到的本地端口。


int get_max_channels() const 🔗

返回连接的对等体所允许的最大通道数。


Array[ENetPacketPeer] get_peers() 🔗

返回与该主机相关联的对等节点列表。

注意: 这份清单中可能会包含一些尚未完全连接或仍在连接过程中的“同伴”。


float pop_statistic(statistic: HostStatistic) 🔗

返回并重置主机统计信息。详情见 HostStatistic


void refuse_new_connections(refuse: bool) 🔗

配置 DTLS 服务器,使其能够自动断开新连接。

注意: 此方法仅在调用 dtls_server_setup() 之后才适用。


Array service(timeout: int = 0) 🔗

在此连接上等待事件的发生,并在主机与其伙伴之间传输数据包,传输时间由给定的 timeout (以毫秒为单位)控制。 返回的 Array 将包含 4 个元素。 一个 EventType ,引发该事件的 ENetPacketPeer ,与该事件相关的数据(如果有),以及与该事件相关的通道(如果有)。如果生成的事件是 EVENT_RECEIVE ,则接收到的包将被排队到与之相关的 ENetPacketPeer 对象中。

请定期调用此函数来处理连接、断开连接的情况,并接收新的数据包。

注意: 此方法必须在参与该事件的两端(发送端和接收端的主机)上均被调用。


void socket_send(destination_address: String, destination_port: int, packet: PackedByteArray) 🔗

从当前绑定此 ENetConnection 实例的地址和端口向目标发送一个 packet

这非常有用,因为它能够为从此受限实例到面向公众的互联网之间的所有设备上的网络地址转换路由表建立条目,从而使得潜在客户端的连接数据包能够通过网络地址转换设备从公共互联网反向路由至此主机。

这需要事先了解潜在客户在公共互联网中可见的地址和通信端口——在任何网络地址转换设备处理其连接请求之后。此信息可以通过 STUN 服务获取,并必须由非潜在客户的实体传递给您的主机。由于对称型网络地址转换路由算法的特性,对于位于对称型网络地址转换后的客户端,这种方法永远无法奏效,因为其 IP 和端口无法事先得知。