traceroute/
traceroute.rs

1use std::net::{IpAddr, Ipv4Addr};
2use std::thread;
3use tracert::trace::Tracer;
4
5fn main() {
6    // UDP traceroute to dns.google (8.8.8.8)
7    let dst_ip: IpAddr = IpAddr::V4(Ipv4Addr::new(8, 8, 8, 8));
8    // IPv6 UDP traceroute to dns.google (2001:4860:4860::8888)
9    //let dst_ip: IpAddr = IpAddr::V6(Ipv6Addr::new(0x2001, 0x4860, 0x4860, 0, 0, 0, 0, 0x8888));
10    let tracer: Tracer = Tracer::new(dst_ip).unwrap();
11    let rx = tracer.get_progress_receiver();
12    // Run trace
13    let handle = thread::spawn(move || tracer.trace());
14    // Print progress
15    println!("Progress:");
16    while let Ok(msg) = rx.lock().unwrap().recv() {
17        println!("{} {} {:?} {:?}", msg.seq, msg.ip_addr, msg.hop, msg.rtt);
18    }
19    // Print final result
20    println!("Result:");
21    match handle.join().unwrap() {
22        Ok(r) => {
23            println!("Status: {:?}", r.status);
24            for node in r.nodes {
25                println!("{:?}", node);
26            }
27            println!("Trace Time: {:?}", r.probe_time);
28        }
29        Err(e) => {
30            print!("{}", e);
31        }
32    }
33}