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
每月下载112次
46KB
912 行
uni-stream
uni-stream
是一个Rust库,用于统一操作TcpStream
和UdpStream
,旨在使您的服务能够通过单一代码实现支持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