enumerate_dacs/
enumerate_dacs.rs

1//! Searches for all broadcasting DACs on the network for 3 seconds and then prints them to stdout.
2
3extern crate ether_dream;
4
5use ether_dream::dac;
6use std::collections::HashMap;
7use std::{io, time};
8
9fn main() {
10    println!("Searching for Ether Dream DACs...");
11
12    let mut dacs = HashMap::new();
13    let three_secs = time::Duration::from_secs(3);
14    let mut rx = ether_dream::recv_dac_broadcasts().expect("failed to bind to UDP socket");
15    rx.set_timeout(Some(three_secs))
16        .expect("failed to set timeout on UDP socket");
17    let loop_start = time::Instant::now();
18    while loop_start.elapsed() < three_secs {
19        let (dac_broadcast, source_addr) = match rx.next_broadcast() {
20            Ok(dac) => dac,
21            Err(e) => match e.kind() {
22                io::ErrorKind::WouldBlock | io::ErrorKind::TimedOut => continue,
23                _ => panic!("an IO error occurred: {}", e),
24            },
25        };
26        let dac::Addressed { mac_address, dac } = dac::Addressed::from_broadcast(&dac_broadcast)
27            .expect("failed to interpret DAC status from received broadcast");
28        if dacs.insert(mac_address, (dac, source_addr)).is_none() {
29            println!("Discovered new DAC \"{}\"...", mac_address);
30        }
31    }
32
33    if dacs.is_empty() {
34        println!("No Ether Dream DACs found on the network.");
35    } else {
36        println!("Discovered the following Ether Dream DACs on the network:");
37        for (i, (mac, (dac, source_addr))) in dacs.into_iter().enumerate() {
38            println!(
39                "{}.\n  MAC address: \"{}\"\n  Network address: \"{}\"\n  {:?}",
40                i + 1,
41                mac,
42                source_addr,
43                dac
44            );
45        }
46    }
47}