enumerate_dacs/
enumerate_dacs.rs1extern 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}