massping 0.5.2

ICMP ping library for sending batches of ICMP echo request packets and measuring the roundtrip time
Documentation
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");

                //println!("Payload: {:?}", &packet[packet.len() - 256..]);
            }
        });

        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");

                //println!("Payload: {:?}", &packet[packet.len() - 256..]);
            }
        });
    }

    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()
            );
            //println!("Payload: {:?}", &packet[packet.len() - 256..]);
        }
    });

    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()
            );
            //println!("Payload: {:?}", &packet[packet.len() - 256..]);
        }
    });

    time::sleep(Duration::from_secs(5)).await;
    handle_v4.abort();
    handle_v6.abort();
}