icmp_ping/
icmp_ping.rs

1use std::net::{IpAddr, Ipv4Addr};
2use std::thread;
3use tracert::ping::Pinger;
4
5fn main() {
6    // ICMPv4 ping to cloudflare's one.one.one.one (1.1.1.1)
7    let dst_ip: IpAddr = IpAddr::V4(Ipv4Addr::new(1, 1, 1, 1));
8    let pinger: Pinger = Pinger::new(dst_ip).unwrap();
9    let rx = pinger.get_progress_receiver();
10    // Run ping
11    let handle = thread::spawn(move || pinger.ping());
12    // Print progress
13    println!("Progress:");
14    while let Ok(msg) = rx.lock().unwrap().recv() {
15        println!("{} {} {:?} {:?}", msg.seq, msg.ip_addr, msg.hop, msg.rtt);
16    }
17    // Print final result
18    println!("Result:");
19    match handle.join().unwrap() {
20        Ok(r) => {
21            println!("Status: {:?}", r.status);
22            for result in r.results {
23                println!("{:?}", result);
24            }
25            println!("Probe Time: {:?}", r.probe_time);
26        }
27        Err(e) => {
28            print!("{}", e);
29        }
30    }
31}