librqbit_dualstack_sockets/
traits.rs1use 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}