use std::{
net::{Ipv4Addr, Ipv6Addr},
sync::Arc,
time::Duration,
};
use massping::{
packet::EchoRequestPacket,
raw_pinger::{RawV4Pinger, RawV6Pinger},
};
use tokio::time;
#[tokio::main(flavor = "current_thread")]
async fn main() {
let localhost_v4: Ipv4Addr = "127.0.0.1".parse().unwrap();
let one_one_one_one_v4: Ipv4Addr = "1.1.1.1".parse().unwrap();
let not_answering_v4: Ipv4Addr = "0.0.0.1".parse().unwrap();
let localhost_v6: Ipv6Addr = "::1".parse().unwrap();
let one_one_one_one_v6: Ipv6Addr = "2606:4700:4700::1111".parse().unwrap();
let v4_pinger = Arc::new(RawV4Pinger::new().expect("setup Ipv4 pinger"));
let v6_pinger = Arc::new(RawV6Pinger::new().expect("setup Ipv6 pinger"));
{
let v4_pinger = Arc::clone(&v4_pinger);
let v6_pinger = Arc::clone(&v6_pinger);
tokio::spawn(async move {
for addr in [localhost_v4, one_one_one_one_v4, not_answering_v4] {
let payload = rand::random::<[u8; 256]>();
let packet = EchoRequestPacket::new(1, 1, &payload);
println!("Send ICMP v4 ping to {}", addr);
v4_pinger
.send_to(addr, &packet)
.await
.expect("send v4 ping");
}
});
tokio::spawn(async move {
for addr in [localhost_v6, one_one_one_one_v6] {
let payload = rand::random::<[u8; 256]>();
let packet = EchoRequestPacket::new(1, 1, &payload);
println!("Send ICMP v6 ping to {}", addr);
v6_pinger
.send_to(addr, &packet)
.await
.expect("send v6 ping");
}
});
}
let handle_v4 = tokio::spawn(async move {
loop {
let packet = v4_pinger.recv().await.unwrap();
println!(
"Recv: {} | Identifier: {} | Sequence number {}",
packet.source(),
packet.identifier(),
packet.sequence_number()
);
}
});
let handle_v6 = tokio::spawn(async move {
loop {
let packet = v6_pinger.recv().await.unwrap();
println!(
"Recv: {} | Identifier: {} | Sequence number {}",
packet.source(),
packet.identifier(),
packet.sequence_number()
);
}
});
time::sleep(Duration::from_secs(5)).await;
handle_v4.abort();
handle_v6.abort();
}