librqbit_dualstack_sockets/
traits.rs

1use std::{
2    net::SocketAddr,
3    task::{Context, Poll},
4};
5
6use socket2::SockRef;
7
8pub trait PollSendToVectored {
9    fn poll_send_to_vectored(
10        &self,
11        cx: &mut Context<'_>,
12        bufs: &[std::io::IoSlice<'_>],
13        target: SocketAddr,
14    ) -> Poll<std::io::Result<usize>>;
15}
16
17impl PollSendToVectored for tokio::net::UdpSocket {
18    fn poll_send_to_vectored(
19        &self,
20        cx: &mut Context<'_>,
21        bufs: &[std::io::IoSlice<'_>],
22        target: SocketAddr,
23    ) -> Poll<std::io::Result<usize>> {
24        let sref = SockRef::from(self);
25        loop {
26            match sref.send_to_vectored(bufs, &target.into()) {
27                Ok(sz) => return Poll::Ready(Ok(sz)),
28                Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {
29                    std::task::ready!(self.poll_send_ready(cx))?;
30                }
31                Err(e) => return Poll::Ready(Err(e)),
32            }
33        }
34    }
35}
36
37impl PollSendToVectored for crate::UdpSocket {
38    fn poll_send_to_vectored(
39        &self,
40        cx: &mut Context<'_>,
41        bufs: &[std::io::IoSlice<'_>],
42        target: SocketAddr,
43    ) -> Poll<std::io::Result<usize>> {
44        let target = self.convert_addr_for_send(target);
45        self.socket().poll_send_to_vectored(cx, bufs, target)
46    }
47}