1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
use std::net::{IpAddr, Ipv4Addr};
//use std::net::Ipv6Addr;
use netprobe::ping::Pinger;
use netprobe::setting::ProbeSetting;
use std::{env, process, thread};
use xenet::net::interface::Interface;

// TCP ping to cloudflare's one.one.one.one:80 (1.1.1.1:80)
fn main() {
    let interface: Interface = match env::args().nth(1) {
        Some(n) => {
            // Use interface specified by user
            let interfaces: Vec<Interface> = xenet::net::interface::get_interfaces();
            let interface: Interface = interfaces
                .into_iter()
                .find(|interface| interface.name == n)
                .expect("Failed to get interface information");
            interface
        }
        None => {
            // Use default interface
            match Interface::default() {
                Ok(interface) => interface,
                Err(e) => {
                    println!("Failed to get default interface: {}", e);
                    process::exit(1);
                }
            }
        }
    };
    let dst_ip: IpAddr = IpAddr::V4(Ipv4Addr::new(1, 1, 1, 1));
    //let dst_ip: IpAddr = IpAddr::V6(Ipv6Addr::new(0x2606, 0x4700, 0x4700, 0, 0, 0, 0, 0x1111));
    let setting: ProbeSetting = ProbeSetting::tcp_ping(interface, dst_ip, 80, 4).unwrap();
    let pinger: Pinger = Pinger::new(setting).unwrap();
    let rx = pinger.get_progress_receiver();
    let handle = thread::spawn(move || pinger.ping());
    for r in rx.lock().unwrap().iter() {
        println!(
            "{} [{:?}] {} Bytes from IP:{}, Port:{:?}, Status:{:?}, HOP:{}, TTL:{}, RTT:{:?}",
            r.seq,
            r.protocol,
            r.received_packet_size,
            r.ip_addr,
            r.port_number,
            r.port_status,
            r.hop,
            r.ttl,
            r.rtt
        );
    }
    match handle.join() {
        Ok(ping_result) => match ping_result {
            Ok(ping_result) => {
                println!(
                    "Transmitted: {}, Received: {}, Loss: {}%",
                    ping_result.stat.transmitted_count,
                    ping_result.stat.received_count,
                    100.0
                        - ping_result.stat.transmitted_count as f64
                            / ping_result.stat.received_count as f64
                            * 100.0
                );
                println!(
                    "MIN: {:?}, MAX:{:?}, AGV:{:?}",
                    ping_result.stat.min, ping_result.stat.max, ping_result.stat.avg
                );
            }
            Err(e) => println!("{:?}", e),
        },
        Err(e) => println!("{:?}", e),
    }
}