1use std::net::{IpAddr, Ipv4Addr};
2use netprobe::ping::Pinger;
4use netprobe::setting::ProbeSetting;
5use std::{env, process, thread};
6use xenet::net::interface::Interface;
7
8fn main() {
10 let interface: Interface = match env::args().nth(1) {
11 Some(n) => {
12 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 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 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}