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 网络编程
每月 149 次下载
250KB
6.5K SLoC
又一个用Rust重写的项目。
功能
Stream
/Sink
/Future
基于异步API。- 底层API但易于使用。
- RakNet功能
- 支持
Unreliable
、Reliable
和ReliableOrdered
数据包。 - 支持多个有序通道。
- 支持
ACK
/NACK
机制。
- 支持
- 由
minitrace-rust
提供的完整跟踪功能。- 您可以在去重、分段等过程中跟踪数据包的范围。
路线图
按优先级排序
- 添加滑动窗口拥塞控制
- 文档
- 更多模糊测试
- 批量基准测试
- 优化单线程运行时(无Send的IO)的性能
- 健壮的客户端实现
- 使用稳定的Rust工具链(
我喜欢nightly)
入门
请参阅示例以了解基本用法。
服务器
IO是一个隐藏类型,它实现了Stream
和Sink
特性。
保持轮询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