#tcp-udp #dns-resolution #tcp-stream #udp #tcp #dns #stream

uni-stream

提供TCP和UDP流量的通用流和自定义DNS解析服务

5个不稳定版本

0.2.0 2024年7月10日
0.1.0 2024年3月18日
0.0.11 2024年3月15日
0.0.2 2024年3月18日
0.0.1 2024年3月14日

网络编程中排名第1119

Download history 19/week @ 2024-06-22 5/week @ 2024-06-29 102/week @ 2024-07-06 10/week @ 2024-07-13

每月下载112

MIT协议

46KB
912

uni-stream

crates.io

uni-stream是一个Rust库,用于统一操作TcpStreamUdpStream,旨在使您的服务能够通过单一代码实现支持UDP和TCP(如代理服务)。此外,该库还提供了自定义DNS服务器解析的能力。

特性

  • 泛型uni-stream通过一些特质提供了UDP和TCP流的抽象,使用户能够轻松进行二次抽象。

  • 可定制uni-stream提供了允许用户定制TCP或UDP连接的DNS服务解析的功能。

用法

要在Rust项目中使用uni-stream,只需将其添加到您的Cargo.toml文件中的依赖项即可

[dependencies]
uni-stream = "*"

您还必须确保Rust版本 >= 1.75,因为需要AFIT,因此您需要将以下rust-toolchain.toml添加到项目根目录

[toolchain]
channel = "1.75.0"

然后,您可以在Rust代码中导入并使用该库。以下是基于泛型的echo_server实现

use tokio::io::AsyncReadExt;
use tokio::io::AsyncWriteExt;
use uni_stream::stream::ListenerProvider;
use uni_stream::stream::StreamAccept;
use uni_stream::stream::TcpListenerProvider;
use uni_stream::stream::UdpListenerProvider;

async fn echo_server<P: ListenerProvider>(
    server_addr: &str,
) -> Result<(), Box<dyn std::error::Error>> {
    let listener = P::bind(server_addr).await?;
    println!("run local server:{server_addr}");
    loop {
        // Accept incoming connections
        let (mut stream, addr) = listener.accept().await?;
        println!("Connected from {}", addr);

        // Process each connection concurrently
        tokio::spawn(async move {
            // Read data from client
            let mut buf = vec![0; 1024];
            loop {
                let n = match stream.read(&mut buf).await {
                    Ok(n) => n,
                    Err(e) => {
                        println!("Error reading: {}", e);
                        return;
                    }
                };

                // If no data received, assume disconnect
                if n == 0 {
                    return;
                }

                // Echo data back to client
                if let Err(e) = stream.write_all(&buf[..n]).await {
                    println!("Error writing: {}", e);
                    return;
                }

                println!("Echoed {} bytes to {}", n, addr);
            }
        });
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let run_udp: bool = true;
    if run_udp {
        echo_server::<UdpListenerProvider>("0.0.0.0:8080").await
    } else {
        echo_server::<TcpListenerProvider>("0.0.0.0:8080").await
    }
}

自定义DNS解析服务器

use uni_stream::addr::set_custom_dns_server;
// use google and alibaba dns server
set_custom_dns_server(&["8.8.8.8".parse().unwrap(), "233.5.5.5".parse().unwrap()]).unwrap();

自定义Udp超时

use uni_stream::udp::set_custom_timeout;
set_custom_timeout(timeout);

或者在UdpStream上不设置任何超时

[dependencies]
uni-stream = { version = "0.1.0", default-features = false }

有关如何使用uni-stream的更多详细信息,请参阅示例

贡献

欢迎对uni-stream的贡献!如果您想为此库做出贡献,请遵循Rust社区的标准贡献指南,包括打开问题、提交pull请求和提供反馈。

许可

uni-stream 采用 MIT 许可协议,允许免费使用、修改和分发,前提是遵守许可证中规定的条款和条件。

希望 uni-stream 对您的项目有所帮助!如果您有任何问题或需要进一步的帮助,请随时联系我们或在存储库中提出问题。

依赖项

~9–19MB
~259K SLoC