massping 0.5.2

ICMP ping library for sending batches of ICMP echo request packets and measuring the roundtrip time
Documentation
use std::{net::IpAddr, sync::Arc, time::Duration};

use futures_util::StreamExt;
use massping::DualstackPinger;
use tokio::time;

#[tokio::main(flavor = "current_thread")]
async fn main() {
    let localhost_v4: IpAddr = "127.0.0.1".parse().unwrap();
    let one_one_one_one_v4: IpAddr = "1.1.1.1".parse().unwrap();
    let not_answering_v4: IpAddr = "0.0.0.1".parse().unwrap();
    let localhost_v6: IpAddr = "::1".parse().unwrap();
    let one_one_one_one_v6: IpAddr = "2606:4700:4700::1111".parse().unwrap();

    let pinger = Arc::new(DualstackPinger::new().expect("setup pinger"));

    let ips = [
        localhost_v4,
        one_one_one_one_v4,
        not_answering_v4,
        localhost_v6,
        one_one_one_one_v6,
    ];

    let mut interval = time::interval(Duration::from_secs(1));
    loop {
        interval.tick().await;

        let pinger = Arc::clone(&pinger);
        tokio::spawn(async move {
            let _ = time::timeout(Duration::from_secs(5), async {
                let mut stream = pinger.measure_many(ips.into_iter());
                while let Some((addr, took)) = stream.next().await {
                    println!("{}: {:?}", addr, took);
                }
            })
            .await;
        });
    }
}