use std::io::{self, Error, ErrorKind};
use std::net::{UdpSocket, SocketAddr};
use std::fmt;
pub const MAX_PCKT_LEN: usize = 600;
pub struct PacketReceiver(UdpSocket);
impl PacketReceiver {
pub fn new(udp: UdpSocket) -> PacketReceiver {
PacketReceiver(udp)
}
pub fn recv_pckt(&self) -> io::Result<(Vec<u8>, SocketAddr)> {
let mut pckt_buf = vec![0u8; MAX_PCKT_LEN];
let (size, addr) = try!(self.0.recv_from(&mut pckt_buf));
if size > pckt_buf.len() {
Err(Error::new(ErrorKind::Other, "UdpSocket Reported Receive Length Greater Than Buffer"))
} else {
pckt_buf.truncate(size);
Ok((pckt_buf, addr))
}
}
}
impl fmt::Display for PacketReceiver {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self.0.local_addr() {
Ok(addr) => write!(f, "{}", addr),
Err(err) => write!(f, "{}", err),
}
}
}