#udt #transport #protocols #networking #data-transfer #udt4

bin+lib tokio-udt

基于 Tokio 原语实现的基于 UDP 的数据传输协议 (UDT) 的实现

8 个版本

0.1.0-alpha.82022 年 10 月 14 日
0.1.0-alpha.72022 年 9 月 27 日
0.1.0-alpha.62022 年 8 月 8 日
0.1.0-alpha.42022 年 7 月 20 日

#2 in #udt

33 每月下载量

AGPL-3.0

145KB
3.5K SLoC

tokio-udt

基于 Tokio 原语实现的基于 UDP 的数据传输协议 (UDT) 的实现。

Crates.io Docs

什么是 UDT?

UDT 是一种高性能数据传输协议。它专门为高速广域网上的数据密集型应用程序设计,以克服 TCP 的效率和公平性问题。正如其名称所示,UDT 基于UDP构建,并提供可靠的数据流和消息服务。

要了解更多关于 UDT 的信息,请参阅 https://udt.sourceforge.io/

您还可以在 https://github.com/eminence/udt 上找到参考 C++ 实现

示例

UDT 监听器

use std::net::Ipv4Addr;
use tokio::io::{AsyncReadExt, Result};
use tokio_udt::UdtListener;

#[tokio::main]
async fn main() -> Result<()> {
    let port = 9000;
    let listener = UdtListener::bind((Ipv4Addr::UNSPECIFIED, port).into(), None).await?;

    println!("Waiting for connections...");

    loop {
        let (addr, mut connection) = listener.accept().await?;
        println!("Accepted connection from {}", addr);
        let mut buffer = Vec::with_capacity(1_000_000);
        tokio::task::spawn({
            async move {
                loop {
                    match connection.read_buf(&mut buffer).await {
                        Ok(_size) => {}
                        Err(e) => {
                            eprintln!("Connnection with {} failed: {}", addr, e);
                            break;
                        }
                    }
                }
            }
        });
    }
}

UDT 客户端

use std::net::Ipv4Addr;
use tokio::io::{AsyncWriteExt, Result};
use tokio_udt::UdtConnection;

#[tokio::main]
async fn main() -> Result<()> {
    let port = 9000;
    let mut connection = UdtConnection::connect((Ipv4Addr::LOCALHOST, port), None).await?;
    loop {
        connection.write_all(b"Hello World!").await?;
    }
}

依赖项

~5–16MB
~204K SLoC