librqbit-dualstack-sockets 0.6.7

utilities for creating dual-stack TCP and UDP tokio sockets
Documentation
use std::{
    net::SocketAddr,
    task::{Context, Poll},
};

use socket2::SockRef;

pub trait PollSendToVectored {
    fn poll_send_to_vectored(
        &self,
        cx: &mut Context<'_>,
        bufs: &[std::io::IoSlice<'_>],
        target: SocketAddr,
    ) -> Poll<std::io::Result<usize>>;
}

impl PollSendToVectored for tokio::net::UdpSocket {
    fn poll_send_to_vectored(
        &self,
        cx: &mut Context<'_>,
        bufs: &[std::io::IoSlice<'_>],
        target: SocketAddr,
    ) -> Poll<std::io::Result<usize>> {
        let sref = SockRef::from(self);
        loop {
            match sref.send_to_vectored(bufs, &target.into()) {
                Ok(sz) => return Poll::Ready(Ok(sz)),
                Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {
                    std::task::ready!(self.poll_send_ready(cx))?;
                }
                Err(e) => return Poll::Ready(Err(e)),
            }
        }
    }
}

impl PollSendToVectored for crate::UdpSocket {
    fn poll_send_to_vectored(
        &self,
        cx: &mut Context<'_>,
        bufs: &[std::io::IoSlice<'_>],
        target: SocketAddr,
    ) -> Poll<std::io::Result<usize>> {
        let target = self.convert_addr_for_send(target);
        self.socket().poll_send_to_vectored(cx, bufs, target)
    }
}