use std::io;
use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr};
use std::pin::Pin;
use std::task::{Context, Poll};
use futures::{AsyncRead, AsyncWrite};
use async_std::net;
use async_std::net::ToSocketAddrs;
#[derive(Debug)]
pub struct TcpStream(net::TcpStream);
#[derive(Debug)]
pub struct TcpListener(net::TcpListener);
impl TcpStream {
pub async fn connect<A: ToSocketAddrs>(addrs: A) -> io::Result<TcpStream> {
net::TcpStream::connect(addrs).await.map(TcpStream)
}
pub fn inner_mut(&mut self) -> &mut net::TcpStream {
&mut self.0
}
pub fn local_addr(&self) -> io::Result<SocketAddr> {
self.0.local_addr()
}
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
self.0.peer_addr()
}
pub fn ttl(&self) -> io::Result<u32> {
self.0.ttl()
}
pub fn set_ttl(&self, ttl: u32) -> io::Result<()> {
self.0.set_ttl(ttl)
}
pub fn nodelay(&self) -> io::Result<bool> {
self.0.nodelay()
}
pub fn set_nodelay(&self, nodelay: bool) -> io::Result<()> {
self.0.set_nodelay(nodelay)
}
}
impl TcpListener {
pub async fn bind<A: ToSocketAddrs>(addrs: A) -> io::Result<TcpListener> {
net::TcpListener::bind(addrs).await.map(TcpListener)
}
pub async fn accept(&self) -> io::Result<(TcpStream, SocketAddr)> {
self.0.accept().await.map(|(t, s)| (TcpStream(t), s))
}
pub fn local_addr(&self) -> io::Result<SocketAddr> {
self.0.local_addr()
}
}
impl From<std::net::TcpStream> for TcpStream {
fn from(stream: std::net::TcpStream) -> TcpStream {
TcpStream(net::TcpStream::from(stream))
}
}
impl From<std::net::TcpListener> for TcpListener {
fn from(listener: std::net::TcpListener) -> TcpListener {
TcpListener(net::TcpListener::from(listener))
}
}
impl AsyncRead for TcpStream {
fn poll_read(mut self: Pin<&mut Self>, cx: &mut Context, buf: &mut [u8]) -> Poll<Result<usize, io::Error>> {
AsyncRead::poll_read(Pin::new(&mut self.0), cx, buf)
}
}
impl AsyncWrite for TcpStream {
fn poll_write(mut self: Pin<&mut Self>, cx: &mut Context, buf: &[u8]) -> Poll<Result<usize, io::Error>> {
AsyncWrite::poll_write(Pin::new(&mut self.0), cx, buf)
}
fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Result<(), io::Error>> {
AsyncWrite::poll_flush(Pin::new(&mut self.0), cx)
}
fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Result<(), io::Error>> {
AsyncWrite::poll_close(Pin::new(&mut self.0), cx)
}
}
#[derive(Debug)]
pub struct UdpSocket(net::UdpSocket);
impl UdpSocket {
pub async fn bind<A: ToSocketAddrs>(addrs: A) -> io::Result<UdpSocket> {
net::UdpSocket::bind(addrs).await.map(UdpSocket)
}
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
self.0.peer_addr()
}
pub fn local_addr(&self) -> io::Result<SocketAddr> {
self.0.local_addr()
}
pub async fn send_to<A: ToSocketAddrs>(&self, buf: &[u8], addrs: A) -> io::Result<usize> {
self.0.send_to(buf, addrs).await
}
pub async fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
self.0.recv_from(buf).await
}
pub async fn peek_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
self.0.peek_from(buf).await
}
pub async fn connect<A: ToSocketAddrs>(&self, addrs: A) -> io::Result<()> {
self.0.connect(addrs).await
}
pub async fn send(&self, buf: &[u8]) -> io::Result<usize> {
self.0.send(buf).await
}
pub async fn recv(&self, buf: &mut [u8]) -> io::Result<usize> {
self.0.recv(buf).await
}
pub async fn peek(&self, buf: &mut [u8]) -> io::Result<usize> {
self.0.peek(buf).await
}
pub fn broadcast(&self) -> io::Result<bool> {
self.0.broadcast()
}
pub fn set_broadcast(&self, on: bool) -> io::Result<()> {
self.0.set_broadcast(on)
}
pub fn multicast_loop_v4(&self) -> io::Result<bool> {
self.0.multicast_loop_v4()
}
pub fn set_multicast_loop_v4(&self, on: bool) -> io::Result<()> {
self.0.set_multicast_loop_v4(on)
}
pub fn multicast_ttl_v4(&self) -> io::Result<u32> {
self.0.multicast_ttl_v4()
}
pub fn set_multicast_ttl_v4(&self, ttl: u32) -> io::Result<()> {
self.0.set_multicast_ttl_v4(ttl)
}
pub fn multicast_loop_v6(&self) -> io::Result<bool> {
self.0.multicast_loop_v6()
}
pub fn set_multicast_loop_v6(&self, on: bool) -> io::Result<()> {
self.0.set_multicast_loop_v6(on)
}
pub fn ttl(&self) -> io::Result<u32> {
self.0.ttl()
}
pub fn set_ttl(&self, ttl: u32) -> io::Result<()> {
self.0.set_ttl(ttl)
}
pub fn join_multicast_v4(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr) -> io::Result<()> {
self.0.join_multicast_v4(multiaddr, interface)
}
pub fn join_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> {
self.0.join_multicast_v6(multiaddr, interface)
}
pub fn leave_multicast_v4(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr) -> io::Result<()> {
self.0.leave_multicast_v4(multiaddr, interface)
}
pub fn leave_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> {
self.0.leave_multicast_v6(multiaddr, interface)
}
}
impl From<std::net::UdpSocket> for UdpSocket {
fn from(socket: std::net::UdpSocket) -> UdpSocket {
UdpSocket(net::UdpSocket::from(socket))
}
}
pub async fn resolve_host<T>(host: T) -> io::Result<impl Iterator<Item = SocketAddr>>
where
T: ToSocketAddrs,
{
host.to_socket_addrs().await
}