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}