kcp2k-rust

Crates.iokcp2k-rust
lib.rskcp2k-rust
version1.0.7
created_at2025-12-03 04:08:43.139749+00
updated_at2025-12-29 03:27:36.081252+00
descriptionA Rust implementation of KCP protocol using revel_cell for thread-safe cell management.
homepage
repositoryhttps://github.com/xintujing/kcp2k-rust
max_upload_size
id1963340
size55,384
aurorax-neo (aurorax-neo)

documentation

https://docs.rs/kcp2k-rust

README

kcp2k-rust

一个使用 Rust 实现的 KCP 协议库,采用 revel_cell 进行线程安全的 cell 管理。

简介

kcp2k-rust 是一个高性能的 KCP(快速可靠协议)实现,提供了客户端和服务器功能。KCP 是一个快速可靠协议,可以比 TCP 浪费 10%-20% 的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。

特性

  • 客户端和服务器支持 - 提供完整的客户端和服务器实现
  • 双通道传输 - 支持可靠(Reliable)和不可靠(Unreliable)两种传输通道
  • 线程安全 - 使用 revel_cell 实现线程安全的 cell 管理
  • 高度可配置 - 丰富的配置选项,包括缓冲区大小、MTU、窗口大小等
  • 事件回调 - 支持连接、数据接收、错误和断开连接等事件回调
  • 低延迟优化 - 默认启用 NoDelay 模式,支持快速重传和自定义更新间隔

安装

Cargo.toml 中添加依赖:

[dependencies]
kcp2k-rust = "1.0.0"

快速开始

服务器示例

use kcp2k_rust::kcp2k_server::Kcp2KServer;
use kcp2k_rust::kcp2k_config::Kcp2KConfig;
use kcp2k_rust::kcp2k_common::{Callback, CallbackType, Kcp2KChannel};
use kcp2k_rust::kcp2k_connection::Kcp2kConnection;

fn callback(conn: &Kcp2kConnection, cb: Callback) {
    match cb.r#type {
        CallbackType::OnConnected => {
            println!("客户端已连接: {}", cb.conn_id);
        }
        CallbackType::OnData => {
            println!("收到数据: {:?}", cb.data);
            // 回显数据
            let _ = conn.send_data(&cb.data, cb.channel);
        }
        CallbackType::OnError => {
            println!("错误: {}", cb.error);
        }
        CallbackType::OnDisconnected => {
            println!("客户端已断开: {}", cb.conn_id);
        }
    }
}

fn main() {
    let config = Kcp2KConfig::default();
    let server = Kcp2KServer::new("0.0.0.0:3100".to_string(), config, callback);
    
    loop {
        server.tick();
    }
}

客户端示例

use kcp2k_rust::kcp2k_client::Kcp2KClient;
use kcp2k_rust::kcp2k_config::Kcp2KConfig;
use kcp2k_rust::kcp2k_common::{Callback, CallbackType, Kcp2KChannel};
use kcp2k_rust::kcp2k_connection::Kcp2kConnection;

fn callback(conn: &Kcp2kConnection, cb: Callback) {
    match cb.r#type {
        CallbackType::OnConnected => {
            println!("已连接到服务器");
            // 发送测试数据
            let _ = conn.send_data(b"Hello, Server!".as_slice(), Kcp2KChannel::Reliable);
        }
        CallbackType::OnData => {
            println!("收到服务器数据: {:?}", cb.data);
        }
        CallbackType::OnError => {
            println!("错误: {}", cb.error);
        }
        CallbackType::OnDisconnected => {
            println!("与服务器断开连接");
        }
    }
}

fn main() {
    let config = Kcp2KConfig::default();
    let client = Kcp2KClient::new(config, callback);
    
    client.connect("127.0.0.1:3100".to_string());
    
    loop {
        client.tick();
    }
}

配置选项

Kcp2KConfig 提供了丰富的配置选项:

pub struct Kcp2KConfig {
    pub dual_mode: bool,              // 是否启用 IPv6/IPv4 双模式
    pub recv_buffer_size: usize,      // 接收缓冲区大小(默认: 7MB)
    pub send_buffer_size: usize,      // 发送缓冲区大小(默认: 7MB)
    pub mtu: usize,                   // 最大传输单元(默认: 1200)
    pub no_delay: bool,               // 是否启用 NoDelay(默认: true)
    pub interval: i32,                // KCP 内部更新间隔,单位毫秒(默认: 10ms)
    pub fast_resend: i32,             // 快速重传参数(默认: 0)
    pub congestion_window: bool,      // 是否启用拥塞窗口(默认: false)
    pub send_window_size: u16,        // 发送窗口大小(默认: 32)
    pub receive_window_size: u16,     // 接收窗口大小(默认: 128)
    pub timeout: u64,                 // 超时时间,单位毫秒(默认: 2000ms)
    pub max_retransmits: u32,         // 最大重传次数(默认: 20)
    pub is_reliable_ping: bool,       // 是否启用可靠 ping(默认: true)
}

自定义配置示例

let config = Kcp2KConfig {
    no_delay: true,
    interval: 10,
    fast_resend: 2,
    send_window_size: 64,
    receive_window_size: 256,
    ..Default::default()
};

传输通道

库支持两种传输通道:

  • Reliable(可靠通道) - 保证数据按顺序、完整地送达
  • Unreliable(不可靠通道) - 不保证顺序和完整性,但延迟更低
// 使用可靠通道发送
conn.send_data(data, Kcp2KChannel::Reliable)?;

// 使用不可靠通道发送
conn.send_data(data, Kcp2KChannel::Unreliable)?;

回调事件

回调函数会接收以下事件类型:

  • OnConnected - 连接建立时触发
  • OnData - 接收到数据时触发
  • OnError - 发生错误时触发
  • OnDisconnected - 连接断开时触发

每个回调包含:

  • conn_id - 连接 ID
  • channel - 数据通道类型
  • data - 接收到的数据(OnData 事件)
  • error - 错误信息(OnError 事件)

运行示例

项目包含一个完整的示例程序:

cargo run --example program

依赖

  • revel_cell - 线程安全的 cell 管理
  • socket2 - 底层 socket 操作
  • kcp - KCP 协议实现
  • log - 日志记录

文档

更多详细信息请参考 API 文档

许可证

本项目采用许可证文件 LICENSE 中指定的许可证。

贡献

欢迎提交 Issue 和 Pull Request!

作者

  • xintujing

仓库

Commit count: 0

cargo fmt