Skip to content

Messaging and Lifecycle

b23r0 edited this page Oct 12, 2026 · 4 revisions

English · 简体中文

消息与连接生命周期

消息边界与格式

send() 发送一条应用消息,recv() 返回一条完整消息;应用无需像 TCP 那样自行处理字节流粘包。当前库对发送数据要求:非空,首字节为 0xfe。接收 API 不返回原始 RakNet 帧、可靠模式或通道元数据。

需要通用自定义消息时,可以使用 0xfe | type | request_id | payload 的封装,但序列化格式、长度校验和业务字段由应用负责。

常用 API

API 用途
RaknetListener::bind(&SocketAddr) 创建监听器
listener.listen().await 启动监听,配置构建选项应在此之前完成
listener.accept().await? 接收新会话
RaknetSocket::connect(&SocketAddr) 用默认 RakNet 版本建立会话
connect_with_version(&SocketAddr, version) 明确指定 RakNet 版本
send(&[u8], Reliability) 发送借用的应用数据
send_with_order_channel(..., u8) 指定排序/序列通道,默认通道为 0
recv().await? 获取 Vec<u8> 消息
send_bytes(Bytes, Reliability) / recv_bytes() 使用不可变共享缓冲区
flush().await? 等待发送队列清空、可靠帧获得传输确认
close().await? 关闭连接
mtu() / raknet_version() 查看协商结果

send() 成功意味着发送路径已接纳并处理消息,不意味着对端业务已经执行。flush() 也仅涉及传输确认;要确认入库或操作成功,设计应用响应。示例中的回显就是一个应用响应。

持续发送与背压

发送队列满时,发送调用异步等待容量释放。可靠模式最多允许 64 个可靠帧在途,分片也占用窗口。普通突发队列的高水位为 256 KiB,计算包含帧开销。

持续发送时保持接收任务运行,避免两端都只发送、停止读取。不要为每条消息无限制创建等待中的任务,否则库内队列有界,应用内等待队列仍会无限增长。使用有界应用队列、并发上限及超时;超时/取消不能撤销已经排队或发出的消息。

大消息和接收限制

对象 当前限制
大 ReliableOrdered 发送消息 最多 65,536 个分片,64 MiB 预算,包含每帧 128 B 开销
可靠接收重排 最多 65,536 个可靠索引
有序消息缓冲 最多 64 MiB 数据
分片重组 最多 1,024 组,每组最多 65,536 个分片,总计 64 MiB 预算含开销
停滞分片组 停滞 60 s 会关闭连接

大消息允许进入空的发送队列,但不绕过总预算。64 MiB 不是可发送有效载荷的精确上限,也不是进程总内存限制。应用数据、运行时和重组缓冲还会占用内存。超限或无效接收状态会关闭连接,避免静默丢弃已经确认的数据。

即使能发送巨大的消息,也应考虑共享窗口和同通道队头阻塞。文件传输更适合在应用层分块,并为实时消息保留独立队列及处理机会。

关闭

使用完连接后调用 close() 并处理结果。连接对象释放也会触发关闭通知。如果应用需要等可靠数据确认,可先调用 flush();仍须对网络断开和对端退出设置业务层超时。

源码 API · 批量接口

报文格式、索引语义、分片限制和重传算法详见 RakNet 协议参考。

同步 API · API 索引 · 错误与超时

Clone this wiki locally