4个版本

0.1.3 2024年7月20日
0.1.2 2024年7月17日
0.1.1 2024年2月10日
0.1.0 2024年2月9日

#449 in 网络编程

Download history 98/week @ 2024-07-12 116/week @ 2024-07-19 10/week @ 2024-07-26 1/week @ 2024-08-02

每月 149 次下载

Apache-2.0

250KB
6.5K SLoC

Header

Crates.io CI Status Coverage License

又一个用Rust重写的项目。

功能

  • Stream/Sink/Future基于异步API。
    • 底层API但易于使用。
  • RakNet功能
    • 支持UnreliableReliableReliableOrdered数据包。
    • 支持多个有序通道。
    • 支持ACK/NACK机制。
  • minitrace-rust提供的完整跟踪功能。
    • 您可以在去重、分段等过程中跟踪数据包的范围。

路线图

按优先级排序

  • 添加滑动窗口拥塞控制
  • 文档
  • 更多模糊测试
  • 批量基准测试
  • 优化单线程运行时(无Send的IO)的性能
  • 健壮的客户端实现
  • 使用稳定的Rust工具链(我喜欢nightly

入门

请参阅示例以了解基本用法。

服务器

IO是一个隐藏类型,它实现了StreamSink特性。

保持轮询incoming,因为它还充当所有IO的路由器。对IO应用Sink::poll_flush将触发刷新所有挂起的包、ACK/NACK和陈旧包。对IO应用Sink::poll_close将确保在返回之前所有数据都由对等方接收(即它可能无限期地重新发送)。

注意:所有计算都是惰性的。在考虑对等方断开连接之前,您需要决定一次刷新多长时间,以及在关闭时等待多长时间。

use bytes::Bytes;
use futures::{SinkExt, StreamExt};
use raknet_rs::server::{self, MakeIncoming};

let socket = tokio::net::UdpSocket::bind("127.0.0.1:0").await?;
let config = server::Config::new()
    .send_buf_cap(1024)
    .sever_guid(114514)
    .advertisement(&b"Hello, I am server"[..])
    ...
let mut incoming = socket.make_incoming(config);
let mut io = incoming.next().await.unwrap();
let data: Bytes = io.next().await.unwrap();
io.send(data).await.unwrap();

客户端

当前版本的客户端仅具有最基本的手 shake 实现,不建议直接使用。

use bytes::Bytes;
use futures::{SinkExt, StreamExt};
use raknet_rs::client::{self, ConnectTo};

let socket = tokio::net::UdpSocket::bind("0.0.0.0:0").await?;
let config = client::Config::new()
    .send_buf_cap(1024)
    .client_guid(1919810)
    ...
let mut conn = socket.connect_to(<addr>, config).await?;
conn.send(Bytes::from_static(b"Hello, Anyone there?"))
    .await?;
let res: Bytes = conn.next().await.unwrap();

依赖项

~4–14MB
~148K SLoC