#[macro_use]
extern crate bitflags;
extern crate byteorder;
pub mod dac;
pub mod protocol;
use protocol::{ReadBytes, SizeBytes};
use std::{io, net};
pub struct RecvDacBroadcasts {
udp_socket: net::UdpSocket,
buffer: [u8; RecvDacBroadcasts::BUFFER_LEN],
}
impl RecvDacBroadcasts {
pub const BUFFER_LEN: usize = protocol::DacBroadcast::SIZE_BYTES;
}
pub fn recv_dac_broadcasts() -> io::Result<RecvDacBroadcasts> {
let broadcast_port = protocol::BROADCAST_PORT;
let broadcast_addr = net::SocketAddrV4::new([0, 0, 0, 0].into(), broadcast_port);
let udp_socket = net::UdpSocket::bind(broadcast_addr)?;
let buffer = [0; RecvDacBroadcasts::BUFFER_LEN];
Ok(RecvDacBroadcasts { udp_socket, buffer })
}
impl RecvDacBroadcasts {
pub fn next_broadcast(&mut self) -> io::Result<(protocol::DacBroadcast, net::SocketAddr)> {
let RecvDacBroadcasts {
ref mut buffer,
ref mut udp_socket,
} = *self;
let (_len, src_addr) = udp_socket.recv_from(buffer)?;
let mut bytes = &buffer[..];
let dac_broadcast = bytes.read_bytes::<protocol::DacBroadcast>()?;
Ok((dac_broadcast, src_addr))
}
pub fn set_timeout(&self, duration: Option<std::time::Duration>) -> io::Result<()> {
self.udp_socket.set_read_timeout(duration)
}
pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
self.udp_socket.set_nonblocking(nonblocking)
}
}
impl Iterator for RecvDacBroadcasts {
type Item = io::Result<(protocol::DacBroadcast, net::SocketAddr)>;
fn next(&mut self) -> Option<Self::Item> {
Some(self.next_broadcast())
}
}