最近听闻Rust已经逐步进入了Linux Kernel,而且一个很好用的软件yazi也是rust开发的,所以想了解一下rust的开发和使用。
基本操作
官网
官网:快速配置 Rust 开发环境并编写一个小应用!
官方练习环境:Rust演练场
官方教材:学习Rust
下载
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
下载之后使用默认安装就好了。
常规操作

实战:一个简单的udp发送工具
main.rs
// 库导入
use anyhow::{Context, Result};
use bytes::Bytes;
use clap::Parser;
use std::fs::File;
use std::io::Read;
use std::net::SocketAddr;
use std::time::Duration;
use tokio::net::UdpSocket;
use tokio::time;
/// UDP 文件发送工具
#[derive(Parser, Debug)]
#[command(author, version, about)]
struct Args {
/// 目标地址 (例如: 127.0.0.1:8080)
#[arg(short, long)]
target: SocketAddr,
/// 要发送的文件路径
#[arg(short, long)]
file: String,
/// 发送速率 (KB/s)
#[arg(short, long, default_value_t = 100)]
rate_kb: usize,
}
// main函数,异步,允许使用await
#[tokio::main]
async fn main() -> Result<()> {
let args = Args::parse();
// 读取文件内容
let mut file = File::open(&args.file).context("无法打开文件")?;
let mut buffer = Vec::new();
file.read_to_end(&mut buffer).context("读取文件失败")?;
let data = Bytes::from(buffer);
// 计算发送参数
let packet_size = 1024; // 每个 UDP 包的大小 (字节)
let packets = data.chunks(packet_size);
let total_packets = packets.len();
let delay_ms = (packet_size as f64 / (args.rate_kb as f64 * 1024.0 / 1000.0)) as u64;
println!(
"发送 {} ({} bytes) 到 {},速率: {} KB/s, 包大小: {} bytes, 间隔: {} ms",
args.file,
data.len(),
args.target,
args.rate_kb,
packet_size,
delay_ms
);
// 创建 UDP socket
let socket = UdpSocket::bind("0.0.0.0:0").await.context("绑定 UDP 端口失败")?;
// 定时发送
let mut interval = time::interval(Duration::from_millis(delay_ms));
for (i, chunk) in packets.enumerate() {
interval.tick().await;
socket
.send_to(chunk, args.target)
.await
.context("发送失败")?;
println!("已发送 {}/{} 包 ({} bytes)", i + 1, total_packets, chunk.len());
}
println!("发送完成!");
Ok(())
}
Cargo.toml
[package]
name = "udp_file_sender"
version = "0.1.0"
edition = "2024"
[dependencies]
tokio = { version = "1.0", features = ["full"] } # 异步运行时
anyhow = "1.0" # 错误处理
bytes = "1.0" # 高效字节处理
clap = { version = "4.0", features = ["derive"] } # 命令行参数解析
运行结果

浙公网安备 33010602011771号