RustによるRakNetプロトコルの実装。
Raknet は、一般にゲーム クライアントとサーバー間の通信に使用される信頼性の高い udp トランスポート プロトコルであり、Minecraft Bedrock Edtion によって基礎的な通信に使用されます。
Raknet プロトコルはさまざまな信頼性オプションをサポートしており、不安定なネットワーク環境では TCP よりも優れた伝送パフォーマンスを発揮します。このプロジェクトは、リバース エンジニアリングによるプロトコルの不完全な実装です。
Tokio 1.x 以上の非同期ランタイムのサポートが必要です。
参照: http://www.jenkinssoftware.com/raknet/manual/index.html
このプロジェクトは Jenkins Software LLC や RakNet とは提携していません。
# Cargo.toml
[ dependencies ]
rust-raknet = " * "
ドキュメント: https://docs.rs/rust-raknet/latest/rust_raknet/
//server
async fn serve ( ) {
let mut listener = RaknetListener :: bind ( "127.0.0.1:19132" . parse ( ) . unwrap ( ) ) . await . unwrap ( ) ;
listener . listen ( ) . await ;
loop {
let socket = listener . accept ( ) . await . unwrap ( ) ;
let buf = socket . recv ( ) . await . unwrap ( ) ;
if buf [ 0 ] == 0xfe {
//do something
}
}
listener . close ( ) . await . unwrap ( ) ;
}
//client
async fn connect ( ) {
let socket = RaknetSocket :: connect ( "127.0.0.1:19132" . parse ( ) . unwrap ( ) ) . await . unwrap ( ) ;
socket . send ( & [ 0xfe ] , Reliability :: ReliableOrdered ) . await . unwrap ( ) ;
let buf = socket . recv ( ) . await . unwrap ( ) ;
if buf [ 0 ] == 0xfe {
//do something
}
socket . close ( ) . await . unwrap ( ) ;
}
このプロジェクトと比較するには Tcp を使用します。サーバーのパケット損失率を 50% に設定し、クライアントはサーバーに接続し、サーバーは 800 バイトのパケットを 30 ミリ秒ごとに合計 100 回送信します。クライアントは受信データごとに遅延時間を計測し、100回の受信の平均時間を算出します。以下の結果が得られる。
テストコード: https://github.com/b23r0/rust-raknet/blob/main/example/test_benchmark/src/main.rs
結果:
(2022年6月12日)
本プロジェクトにより、パケットロス率の高いネットワーク環境において、TCPと比較して遅延時間を約50%削減することが可能となります。
オプション:
これらの素晴らしい人々に感謝します。
b23r0 | 名詞 |
あらゆる種類の貢献を歓迎します。オープンソースや大きな目的に貢献したいと思ったことがあるなら、今がそのチャンスです。
BTC : 1ヒーローYcNYMhjsq8RYCx1stSaRZnQd9B9Eq
ETH : 0x9999997B3deF7b69c09D7a9CA65E5242fb04a764