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