[Rust] 首次接触Rust

最近听闻Rust已经逐步进入了Linux Kernel,而且一个很好用的软件yazi也是rust开发的,所以想了解一下rust的开发和使用。

基本操作

官网

官网:快速配置 Rust 开发环境并编写一个小应用!
官方练习环境:Rust演练场
官方教材:学习Rust

下载

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

下载之后使用默认安装就好了。

常规操作

image

实战:一个简单的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"] }  # 命令行参数解析

运行结果

image

posted on 2025-04-01 00:18  风惊庭前叶  阅读(28)  评论(0)    收藏  举报