use std::io;
use std::net::SocketAddr;
#[cfg(unix)]
use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
use crate::sys;
use crate::event::{Evented, EventedId};
use crate::poll::{Interests, PollOption, Poller};
#[derive(Debug)]
pub struct UdpSocket {
socket: sys::UdpSocket,
}
impl UdpSocket {
pub const INTERESTS: Interests = Interests::BOTH;
pub fn bind(address: SocketAddr) -> io::Result<UdpSocket> {
sys::UdpSocket::bind(address).map(|socket| UdpSocket { socket })
}
pub fn connect(self, address: SocketAddr) -> io::Result<ConnectedUdpSocket> {
self.socket.connect(address)
.map(|_| ConnectedUdpSocket { socket: self.socket })
}
pub fn local_addr(&mut self) -> io::Result<SocketAddr> {
self.socket.local_addr()
}
pub fn send_to(&mut self, buf: &[u8], target: SocketAddr) -> io::Result<usize> {
self.socket.send_to(buf, &target)
}
pub fn recv_from(&mut self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
self.socket.recv_from(buf)
}
pub fn peek_from(&mut self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
self.socket.peek_from(buf)
}
pub fn take_error(&mut self) -> io::Result<Option<io::Error>> {
self.socket.take_error()
}
}
impl Evented for UdpSocket {
fn register(&mut self, poller: &mut Poller, id: EventedId, interests: Interests, opt: PollOption) -> io::Result<()> {
self.socket.register(poller, id, interests, opt)
}
fn reregister(&mut self, poller: &mut Poller, id: EventedId, interests: Interests, opt: PollOption) -> io::Result<()> {
self.socket.reregister(poller, id, interests, opt)
}
fn deregister(&mut self, poller: &mut Poller) -> io::Result<()> {
self.socket.deregister(poller)
}
}
#[cfg(unix)]
impl IntoRawFd for UdpSocket {
fn into_raw_fd(self) -> RawFd {
self.socket.into_raw_fd()
}
}
#[cfg(unix)]
impl AsRawFd for UdpSocket {
fn as_raw_fd(&self) -> RawFd {
self.socket.as_raw_fd()
}
}
#[cfg(unix)]
impl FromRawFd for UdpSocket {
unsafe fn from_raw_fd(fd: RawFd) -> UdpSocket {
UdpSocket {
socket: FromRawFd::from_raw_fd(fd),
}
}
}
#[derive(Debug)]
pub struct ConnectedUdpSocket {
socket: sys::UdpSocket,
}
impl ConnectedUdpSocket {
pub const INTERESTS: Interests = Interests::BOTH;
pub fn connect(bind_address: SocketAddr, connect_address: SocketAddr) -> io::Result<ConnectedUdpSocket> {
UdpSocket::bind(bind_address)
.and_then(|socket| socket.connect(connect_address))
}
pub fn local_addr(&mut self) -> io::Result<SocketAddr> {
self.socket.local_addr()
}
pub fn send(&mut self, buf: &[u8]) -> io::Result<usize> {
self.socket.send(buf)
}
pub fn recv(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.socket.recv(buf)
}
pub fn peek(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.socket.peek(buf)
}
pub fn take_error(&mut self) -> io::Result<Option<io::Error>> {
self.socket.take_error()
}
}
impl Evented for ConnectedUdpSocket {
fn register(&mut self, poller: &mut Poller, id: EventedId, interests: Interests, opt: PollOption) -> io::Result<()> {
self.socket.register(poller, id, interests, opt)
}
fn reregister(&mut self, poller: &mut Poller, id: EventedId, interests: Interests, opt: PollOption) -> io::Result<()> {
self.socket.reregister(poller, id, interests, opt)
}
fn deregister(&mut self, poller: &mut Poller) -> io::Result<()> {
self.socket.deregister(poller)
}
}
#[cfg(unix)]
impl IntoRawFd for ConnectedUdpSocket {
fn into_raw_fd(self) -> RawFd {
self.socket.into_raw_fd()
}
}
#[cfg(unix)]
impl AsRawFd for ConnectedUdpSocket {
fn as_raw_fd(&self) -> RawFd {
self.socket.as_raw_fd()
}
}
#[cfg(unix)]
impl FromRawFd for ConnectedUdpSocket {
unsafe fn from_raw_fd(fd: RawFd) -> ConnectedUdpSocket {
ConnectedUdpSocket {
socket: FromRawFd::from_raw_fd(fd),
}
}
}