use std::net;
use std::fmt;
use std::iter;
use std::io::Error;
use std::sync::mpsc::TryRecvError;
use ::Socket;
pub struct UdpSocket {
socket: net::UdpSocket,
buffer: Vec<u8>
}
impl Socket for UdpSocket {
fn new<T: net::ToSocketAddrs>(
address: T, max_packet_size: usize
) -> Result<Self, Error> {
let socket = try!(net::UdpSocket::bind(address));
try!(socket.set_nonblocking(true));
let buffer: Vec<u8> = iter::repeat(0).take(max_packet_size).collect();
Ok(UdpSocket {
socket: socket,
buffer: buffer
})
}
fn try_recv(&mut self) -> Result<(net::SocketAddr, Vec<u8>), TryRecvError> {
if let Ok((len, src)) = self.socket.recv_from(&mut self.buffer) {
Ok((src, self.buffer[..len].to_vec()))
} else {
Err(TryRecvError::Empty)
}
}
fn send_to(
&mut self, data: &[u8], addr: net::SocketAddr)
-> Result<usize, Error> {
self.socket.send_to(data, addr)
}
fn local_addr(&self) -> Result<net::SocketAddr, Error> {
self.socket.local_addr()
}
}
impl fmt::Debug for UdpSocket {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "UdpSocket({:?})", self.socket)
}
}