cap_async_std/net/
udp_socket.rs1use crate::net::{Ipv4Addr, Ipv6Addr, SocketAddr};
2#[cfg(unix)]
3use async_std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
4use async_std::{io, net};
5#[cfg(not(windows))]
6use io_lifetimes::{AsFd, BorrowedFd, OwnedFd};
7#[cfg(windows)]
8use io_lifetimes::{AsSocket, BorrowedSocket, OwnedSocket};
9use std::fmt;
10#[cfg(windows)]
11use {
12    async_std::os::windows::io::{AsRawSocket, FromRawSocket, IntoRawSocket, RawSocket},
13    io_extras::os::windows::{
14        AsHandleOrSocket, AsRawHandleOrSocket, BorrowedHandleOrSocket, IntoRawHandleOrSocket,
15        OwnedHandleOrSocket, RawHandleOrSocket,
16    },
17};
18
19pub struct UdpSocket {
34    pub(crate) std: net::UdpSocket,
35}
36
37impl UdpSocket {
38    #[inline]
44    pub fn from_std(std: net::UdpSocket) -> Self {
45        Self { std }
46    }
47
48    #[inline]
52    pub async fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
53        self.std.recv_from(buf).await
54    }
55
56    #[inline]
63    pub fn peer_addr(&self) -> io::Result<SocketAddr> {
64        self.std.peer_addr()
65    }
66
67    #[inline]
71    pub fn local_addr(&self) -> io::Result<SocketAddr> {
72        self.std.local_addr()
73    }
74
75    #[inline]
89    pub fn set_broadcast(&self, broadcast: bool) -> io::Result<()> {
90        self.std.set_broadcast(broadcast)
91    }
92
93    #[inline]
97    pub fn broadcast(&self) -> io::Result<bool> {
98        self.std.broadcast()
99    }
100
101    #[inline]
106    pub fn set_multicast_loop_v4(&self, multicast_loop_v4: bool) -> io::Result<()> {
107        self.std.set_multicast_loop_v4(multicast_loop_v4)
108    }
109
110    #[inline]
114    pub fn multicast_loop_v4(&self) -> io::Result<bool> {
115        self.std.multicast_loop_v4()
116    }
117
118    #[inline]
123    pub fn set_multicast_ttl_v4(&self, multicast_ttl_v4: u32) -> io::Result<()> {
124        self.std.set_multicast_ttl_v4(multicast_ttl_v4)
125    }
126
127    #[inline]
131    pub fn multicast_ttl_v4(&self) -> io::Result<u32> {
132        self.std.multicast_ttl_v4()
133    }
134
135    #[inline]
140    pub fn set_multicast_loop_v6(&self, multicast_loop_v6: bool) -> io::Result<()> {
141        self.std.set_multicast_loop_v6(multicast_loop_v6)
142    }
143
144    #[inline]
148    pub fn multicast_loop_v6(&self) -> io::Result<bool> {
149        self.std.multicast_loop_v6()
150    }
151
152    #[inline]
156    pub fn set_ttl(&self, ttl: u32) -> io::Result<()> {
157        self.std.set_ttl(ttl)
158    }
159
160    #[inline]
164    pub fn ttl(&self) -> io::Result<u32> {
165        self.std.ttl()
166    }
167
168    #[allow(clippy::trivially_copy_pass_by_ref)]
172    #[inline]
173    pub fn join_multicast_v4(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr) -> io::Result<()> {
174        self.std.join_multicast_v4(multiaddr, interface)
175    }
176
177    #[allow(clippy::trivially_copy_pass_by_ref)]
181    #[inline]
182    pub fn join_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> {
183        self.std.join_multicast_v6(multiaddr, interface)
184    }
185
186    #[allow(clippy::trivially_copy_pass_by_ref)]
190    #[inline]
191    pub fn leave_multicast_v4(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr) -> io::Result<()> {
192        self.std.leave_multicast_v4(multiaddr, interface)
193    }
194
195    #[allow(clippy::trivially_copy_pass_by_ref)]
199    #[inline]
200    pub fn leave_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> {
201        self.std.leave_multicast_v6(multiaddr, interface)
202    }
203
204    #[inline]
211    pub async fn send(&self, buf: &[u8]) -> io::Result<usize> {
212        self.std.send(buf).await
213    }
214
215    #[inline]
220    pub async fn recv(&self, buf: &mut [u8]) -> io::Result<usize> {
221        self.std.recv(buf).await
222    }
223
224    }
228
229unsafe impl io_lifetimes::views::SocketlikeViewType for UdpSocket {}
231
232#[cfg(not(windows))]
233impl FromRawFd for UdpSocket {
234    #[inline]
235    unsafe fn from_raw_fd(fd: RawFd) -> Self {
236        Self::from_std(net::UdpSocket::from_raw_fd(fd))
237    }
238}
239
240#[cfg(not(windows))]
241impl From<OwnedFd> for UdpSocket {
242    #[inline]
243    fn from(fd: OwnedFd) -> Self {
244        Self::from_std(net::UdpSocket::from(fd))
245    }
246}
247
248#[cfg(windows)]
249impl FromRawSocket for UdpSocket {
250    #[inline]
251    unsafe fn from_raw_socket(socket: RawSocket) -> Self {
252        Self::from_std(net::UdpSocket::from_raw_socket(socket))
253    }
254}
255
256#[cfg(windows)]
257impl From<OwnedSocket> for UdpSocket {
258    #[inline]
259    fn from(socket: OwnedSocket) -> Self {
260        Self::from_std(net::UdpSocket::from(socket))
261    }
262}
263
264#[cfg(not(windows))]
265impl AsRawFd for UdpSocket {
266    #[inline]
267    fn as_raw_fd(&self) -> RawFd {
268        self.std.as_raw_fd()
269    }
270}
271
272#[cfg(not(windows))]
273impl AsFd for UdpSocket {
274    #[inline]
275    fn as_fd(&self) -> BorrowedFd<'_> {
276        self.std.as_fd()
277    }
278}
279
280#[cfg(windows)]
281impl AsRawSocket for UdpSocket {
282    #[inline]
283    fn as_raw_socket(&self) -> RawSocket {
284        self.std.as_raw_socket()
285    }
286}
287
288#[cfg(windows)]
289impl AsSocket for UdpSocket {
290    #[inline]
291    fn as_socket(&self) -> BorrowedSocket<'_> {
292        self.std.as_socket()
293    }
294}
295
296#[cfg(windows)]
297impl AsRawHandleOrSocket for UdpSocket {
298    #[inline]
299    fn as_raw_handle_or_socket(&self) -> RawHandleOrSocket {
300        self.std.as_raw_handle_or_socket()
301    }
302}
303
304#[cfg(windows)]
305impl AsHandleOrSocket for UdpSocket {
306    #[inline]
307    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
308        self.std.as_handle_or_socket()
309    }
310}
311
312#[cfg(not(windows))]
313impl IntoRawFd for UdpSocket {
314    #[inline]
315    fn into_raw_fd(self) -> RawFd {
316        self.std.into_raw_fd()
317    }
318}
319
320#[cfg(not(windows))]
321impl From<UdpSocket> for OwnedFd {
322    #[inline]
323    fn from(socket: UdpSocket) -> OwnedFd {
324        socket.std.into()
325    }
326}
327
328#[cfg(windows)]
329impl IntoRawSocket for UdpSocket {
330    #[inline]
331    fn into_raw_socket(self) -> RawSocket {
332        self.std.into_raw_socket()
333    }
334}
335
336#[cfg(windows)]
337impl From<UdpSocket> for OwnedSocket {
338    #[inline]
339    fn from(socket: UdpSocket) -> OwnedSocket {
340        socket.std.into()
341    }
342}
343
344#[cfg(windows)]
345impl IntoRawHandleOrSocket for UdpSocket {
346    #[inline]
347    fn into_raw_handle_or_socket(self) -> RawHandleOrSocket {
348        self.std.into_raw_handle_or_socket()
349    }
350}
351
352#[cfg(windows)]
353impl From<UdpSocket> for OwnedHandleOrSocket {
354    #[inline]
355    fn from(socket: UdpSocket) -> Self {
356        socket.std.into()
357    }
358}
359
360impl fmt::Debug for UdpSocket {
361    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
362        self.std.fmt(f)
363    }
364}