let sender = @moonkcp.Kcp::create(1)
let receiver = @moonkcp.Kcp::create(1)
sender.set_nodelay(1, 10, 2, 1)
let _ = sender.send(payload)
let frames = sender.update(now_ms)
for frame in frames {
let _ = receiver.input(frame)
}
match receiver.recv() {
Some(msg) => // 整消息(碎片已合并)
None => () // 暂无就绪消息
}
会话壳
let session = @moonkcp.KcpSession::new(1, 128)
let n = session.send_message(payload) // 窗口满返回 -2(背压)
let code = session.on_datagram(datagram)
let frames = session.tick(now_ms)
UDP 适配器
let hub = @adapter.KcpUdpHub::listen(128, 1024) // 服务端:多会话
let peer = @adapter.KcpUdpPeer::connect_client(7, 128, hub.local_addr())
MoonKCP
thy1016/moonkcp是 KCP 协议的 MoonBit 纯实现:以 UDP 为底座的可靠有序 ARQ 传输库。协议核心为零 IO、零时钟的纯状态机,毫秒由调用方注入,帧由 调用方搬运;实现与 skywind3000/kcp C 参照保持差分对拍逐字节等价。包结构:
thy1016/moonkcp(协议核心与会话面)+thy1016/moonkcp/adapter(async UDP 适配器,native 门)。特性
KcpSession:消息分片与碎片合并、发送水位背压、FIFO 收件队列。KcpServer:按报文头 conv 路由、未知会话自动建立、 会话数上限护栏、闲置回收。KcpUdpPeer(双端直连)与KcpUdpHub(单 socket 多会话 组合宿主)。Kcp::stats:RTT、RTO、拥塞窗、队列读数、接收守恒账。fec/(可选):Reed-Solomon 系统码(GF(2^8)、Cauchy 阵 MDS),组内 ≤m 丢失当场恢复不等重传;MdsCodec端口可换编码器,FecSession组合壳一键接入。安装
确保环境中已安装 MoonBit 工具链,然后在模块根目录:
协议核心在消费包的
moon.pkgimport块中添加"thy1016/moonkcp", 代码内以@moonkcp前缀使用;UDP 适配器另加"thy1016/moonkcp/adapter"(@adapter前缀)。快速上手
协议核心(零 IO 零时钟)
宿主持有对端实例,按不大于
interval的间隔注入当前毫秒并搬运帧:会话壳
UDP 适配器
可运行示例见
examples/(echo 服务端与对打客户端)。FEC 前向纠错(可选层)
FecSession组合KcpSession与 FEC 发/收机,应用面 API 一一透传; FEC 关闭 = 直接用KcpSession(核零沾):domain/fec_dialect.toml)。moon run workspace/fec_bench --release(RS(10,3)/1200B 片:编码 ~100 MB/s、最坏恢复 ~45 MB/s、层直通 ~9 MB/s,百 KB/s 量级视频流 占 CPU 不足 1%)。MdsCodec端口注入,RS 仅为缺省适配器;编解码器工厂逐组 实例化(k/m 随帧头自描述),换码 = 换适配器,层机器零改动。API 总览
Kcp::create/set_nodelay/set_wnd/set_mtuKcp::send/recv/peeksizeKcp::input/update/checkKcp::stats/waitsnd/is_deadKcpSession::send_message/poll_messageKcpServer::on_datagram/tick/sweep@adapter.KcpUdpPeer@adapter.KcpUdpHub@fec.FecSession@fec.FecTx/FecRx/RsCodec/MdsCodec错误面
Kcp::input:-1长度不足或 conv 不符;-2声明长度超出报文余量;-3非法命令字节。KcpSession::send_message:-2发送窗口满(背压拒收);成功返回 接受字节数。KcpServer::on_datagram:-4会话表满,报文弃置。Kcp::recv:None表示队列为空或碎片未齐。设计边界
定位与演进的完整说明见
spec.md。测试与验证
实测读数(2026-10-25):
.tests/kcp/内为差分对拍所用 C 参照(skywind3000/kcp 的ikcp.c/ikcp.h精简收录,原件未修改),出处见.tests/README.md。许可证
LICENSE)。.tests/kcp/内 C 参照文件按 MIT 许可分发,版权归其原作者。