tcp_ping/
tcp_ping.rs

1use std::net::{IpAddr, Ipv4Addr};
2//use std::net::Ipv6Addr;
3use netprobe::ping::Pinger;
4use netprobe::setting::ProbeSetting;
5use std::{env, process, thread};
6use xenet::net::interface::Interface;
7
8// TCP ping to cloudflare's one.one.one.one:80 (1.1.1.1:80)
9fn main() {
10    let interface: Interface = match env::args().nth(1) {
11        Some(n) => {
12            // Use interface specified by user
13            let interfaces: Vec<Interface> = xenet::net::interface::get_interfaces();
14            let interface: Interface = interfaces
15                .into_iter()
16                .find(|interface| interface.name == n)
17                .expect("Failed to get interface information");
18            interface
19        }
20        None => {
21            // Use default interface
22            match Interface::default() {
23                Ok(interface) => interface,
24                Err(e) => {
25                    println!("Failed to get default interface: {}", e);
26                    process::exit(1);
27                }
28            }
29        }
30    };
31    let dst_ip: IpAddr = IpAddr::V4(Ipv4Addr::new(1, 1, 1, 1));
32    //let dst_ip: IpAddr = IpAddr::V6(Ipv6Addr::new(0x2606, 0x4700, 0x4700, 0, 0, 0, 0, 0x1111));
33    let setting: ProbeSetting = ProbeSetting::tcp_ping(interface, dst_ip, 80, 4).unwrap();
34    let pinger: Pinger = Pinger::new(setting).unwrap();
35    let rx = pinger.get_progress_receiver();
36    let handle = thread::spawn(move || pinger.ping());
37    for r in rx.lock().unwrap().iter() {
38        println!(
39            "{} [{:?}] {} Bytes from IP:{}, Port:{:?}, Status:{:?}, HOP:{}, TTL:{}, RTT:{:?}",
40            r.seq,
41            r.protocol,
42            r.received_packet_size,
43            r.ip_addr,
44            r.port_number,
45            r.port_status,
46            r.hop,
47            r.ttl,
48            r.rtt
49        );
50    }
51    match handle.join() {
52        Ok(ping_result) => match ping_result {
53            Ok(ping_result) => {
54                println!(
55                    "Transmitted: {}, Received: {}, Loss: {}%",
56                    ping_result.stat.transmitted_count,
57                    ping_result.stat.received_count,
58                    100.0
59                        - ping_result.stat.transmitted_count as f64
60                            / ping_result.stat.received_count as f64
61                            * 100.0
62                );
63                println!(
64                    "MIN: {:?}, MAX:{:?}, AGV:{:?}",
65                    ping_result.stat.min, ping_result.stat.max, ping_result.stat.avg
66                );
67            }
68            Err(e) => println!("{:?}", e),
69        },
70        Err(e) => println!("{:?}", e),
71    }
72}