#ping #icmp #linux #echo #fragment #sync #async

bin+lib ping-rs

为 Windows 和 Linux 提供 ICMP 回显 (ping) 功能

3 个版本

0.1.2 2023 年 1 月 7 日
0.1.1 2023 年 1 月 6 日
0.1.0 2023 年 1 月 6 日

#16#icmp

Download history 165/week @ 2024-03-11 255/week @ 2024-03-18 239/week @ 2024-03-25 351/week @ 2024-04-01 174/week @ 2024-04-08 160/week @ 2024-04-15 282/week @ 2024-04-22 137/week @ 2024-04-29 102/week @ 2024-05-06 208/week @ 2024-05-13 126/week @ 2024-05-20 128/week @ 2024-05-27 161/week @ 2024-06-03 117/week @ 2024-06-10 196/week @ 2024-06-17 148/week @ 2024-06-24

653 每月下载次数

MIT 许可证

37KB
736

ping-rs

Rust 的 ICMP ping 库。支持 Windows 和 Linux。

请参阅 /bin/simple_ping.rs 中的用法


lib.rs:

为 Windows 和 Linux 提供 ICMP 回显 (ping) 功能。此库无需 root/admin 权限即可进行 ping 操作。它提供同步和异步 ping 函数: send_pingsend_ping_async

Linux 版本目前尚不支持 "不要分段" 标志。

使用示例

示例也提供在 /bin/sample_ping.rs

同步 ping

use std::time::Duration;

fn main(){
    let addr = "8.8.8.8".parse().unwrap();
    let data = [1,2,3,4];  // ping data
    let timeout = Duration::from_secs(1);
    let options = ping_rs::PingOptions { ttl: 128, dont_fragment: true };
    let result = ping_rs::send_ping(&addr, timeout, &data, Some(&options));
    match result {
        Ok(reply) => println!("Reply from {}: bytes={} time={}ms TTL={}", reply.address, data.len(), reply.rtt, options.ttl),
        Err(e) => println!("{:?}", e)
    }
}

异步 ping

请注意,此示例中使用了 futures 包。此外,传递给函数的数据必须用 Arc 包装,因为在 Windows 的实现中,此数据的地址将被传递给 Win32 API。

use std::sync::Arc;
use std::time::Duration;

fn main(){
    let addr = "8.8.8.8".parse().unwrap();
    let data = [1,2,3,4];  // ping data
    let data_arc = Arc::new(&data[..]);
    let timeout = Duration::from_secs(1);
    let options = ping_rs::PingOptions { ttl: 128, dont_fragment: true };
    let future = ping_rs::send_ping_async(&addr, timeout, data_arc, Some(&options));
    let result = futures::executor::block_on(future);
    match result {
        Ok(reply) => println!("Reply from {}: bytes={} time={}ms TTL={}", reply.address, data.len(), reply.rtt, options.ttl),
        Err(e) => println!("{:?}", e)
    }
}

依赖项

~1–42MB
~606K SLoC