netsim-embed 0.9.1

Network simulator.
Documentation
use anyhow::Result;
use async_io::Async;
use async_trait::async_trait;
use netsim_embed_cli::{run_server, Server};
use std::net::{Ipv4Addr, UdpSocket};

pub struct BroadcastServer {
    socket: Async<UdpSocket>,
}

#[async_trait]
impl Server for BroadcastServer {
    async fn start() -> Result<Self> {
        let socket = async_io::Async::<UdpSocket>::bind((Ipv4Addr::UNSPECIFIED, 5353))?;
        let multicast = [224, 0, 0, 251].into();
        socket
            .get_ref()
            .join_multicast_v4(&multicast, &Ipv4Addr::UNSPECIFIED)
            .unwrap();
        Ok(Self { socket })
    }

    async fn run(&mut self) -> Result<()> {
        loop {
            let mut buf = [0u8; 11];
            let (len, _addr) = self.socket.recv_from(&mut buf).await?;
            if &buf[..len] == b"broadcast" {
                println!("received broadcast message");
                break;
            }
        }
        Ok(())
    }
}

#[async_std::main]
async fn main() -> Result<()> {
    run_server::<BroadcastServer>().await
}