tokio/net/udp.rs
1use crate::io::{Interest, PollEvented, ReadBuf, Ready};
2use crate::net::{to_socket_addrs, ToSocketAddrs};
3use crate::util::check_socket_for_blocking;
4
5use std::fmt;
6use std::io;
7use std::net::{self, Ipv4Addr, Ipv6Addr, SocketAddr};
8use std::task::{ready, Context, Poll};
9
10cfg_io_util! {
11 use bytes::BufMut;
12}
13
14cfg_net! {
15 /// A UDP socket.
16 ///
17 /// UDP is "connectionless", unlike TCP. Meaning, regardless of what address you've bound to, a `UdpSocket`
18 /// is free to communicate with many different remotes. In tokio there are basically two main ways to use `UdpSocket`:
19 ///
20 /// * one to many: [`bind`](`UdpSocket::bind`) and use [`send_to`](`UdpSocket::send_to`)
21 /// and [`recv_from`](`UdpSocket::recv_from`) to communicate with many different addresses
22 /// * one to one: [`connect`](`UdpSocket::connect`) and associate with a single address, using [`send`](`UdpSocket::send`)
23 /// and [`recv`](`UdpSocket::recv`) to communicate only with that remote address
24 ///
25 /// This type does not provide a `split` method, because this functionality
26 /// can be achieved by instead wrapping the socket in an [`Arc`]. Note that
27 /// you do not need a `Mutex` to share the `UdpSocket` — an `Arc<UdpSocket>`
28 /// is enough. This is because all of the methods take `&self` instead of
29 /// `&mut self`. Once you have wrapped it in an `Arc`, you can call
30 /// `.clone()` on the `Arc<UdpSocket>` to get multiple shared handles to the
31 /// same socket. An example of such usage can be found further down.
32 ///
33 /// [`Arc`]: std::sync::Arc
34 ///
35 /// # Streams
36 ///
37 /// If you need to listen over UDP and produce a [`Stream`], you can look
38 /// at [`UdpFramed`].
39 ///
40 /// [`UdpFramed`]: https://docs.rs/tokio-util/latest/tokio_util/udp/struct.UdpFramed.html
41 /// [`Stream`]: https://docs.rs/futures/0.3/futures/stream/trait.Stream.html
42 ///
43 /// # Example: one to many (bind)
44 ///
45 /// Using `bind` we can create a simple echo server that sends and recv's with many different clients:
46 /// ```no_run
47 /// use tokio::net::UdpSocket;
48 /// use std::io;
49 ///
50 /// #[tokio::main]
51 /// async fn main() -> io::Result<()> {
52 /// let sock = UdpSocket::bind("0.0.0.0:8080").await?;
53 /// let mut buf = [0; 1024];
54 /// loop {
55 /// let (len, addr) = sock.recv_from(&mut buf).await?;
56 /// println!("{:?} bytes received from {:?}", len, addr);
57 ///
58 /// let len = sock.send_to(&buf[..len], addr).await?;
59 /// println!("{:?} bytes sent", len);
60 /// }
61 /// }
62 /// ```
63 ///
64 /// # Example: one to one (connect)
65 ///
66 /// Or using `connect` we can echo with a single remote address using `send` and `recv`:
67 /// ```no_run
68 /// use tokio::net::UdpSocket;
69 /// use std::io;
70 ///
71 /// #[tokio::main]
72 /// async fn main() -> io::Result<()> {
73 /// let sock = UdpSocket::bind("0.0.0.0:8080").await?;
74 ///
75 /// let remote_addr = "127.0.0.1:59611";
76 /// sock.connect(remote_addr).await?;
77 /// let mut buf = [0; 1024];
78 /// loop {
79 /// let len = sock.recv(&mut buf).await?;
80 /// println!("{:?} bytes received from {:?}", len, remote_addr);
81 ///
82 /// let len = sock.send(&buf[..len]).await?;
83 /// println!("{:?} bytes sent", len);
84 /// }
85 /// }
86 /// ```
87 ///
88 /// # Example: Splitting with `Arc`
89 ///
90 /// Because `send_to` and `recv_from` take `&self`. It's perfectly alright
91 /// to use an `Arc<UdpSocket>` and share the references to multiple tasks.
92 /// Here is a similar "echo" example that supports concurrent
93 /// sending/receiving:
94 ///
95 /// ```no_run
96 /// use tokio::{net::UdpSocket, sync::mpsc};
97 /// use std::{io, net::SocketAddr, sync::Arc};
98 ///
99 /// #[tokio::main]
100 /// async fn main() -> io::Result<()> {
101 /// let sock = UdpSocket::bind("0.0.0.0:8080".parse::<SocketAddr>().unwrap()).await?;
102 /// let r = Arc::new(sock);
103 /// let s = r.clone();
104 /// let (tx, mut rx) = mpsc::channel::<(Vec<u8>, SocketAddr)>(1_000);
105 ///
106 /// tokio::spawn(async move {
107 /// while let Some((bytes, addr)) = rx.recv().await {
108 /// let len = s.send_to(&bytes, &addr).await.unwrap();
109 /// println!("{:?} bytes sent", len);
110 /// }
111 /// });
112 ///
113 /// let mut buf = [0; 1024];
114 /// loop {
115 /// let (len, addr) = r.recv_from(&mut buf).await?;
116 /// println!("{:?} bytes received from {:?}", len, addr);
117 /// tx.send((buf[..len].to_vec(), addr)).await.unwrap();
118 /// }
119 /// }
120 /// ```
121 ///
122 pub struct UdpSocket {
123 io: PollEvented<mio::net::UdpSocket>,
124 }
125}
126
127impl UdpSocket {
128 /// This function will create a new UDP socket and attempt to bind it to
129 /// the `addr` provided.
130 ///
131 /// Binding with a port number of 0 will request that the OS assigns a port
132 /// to this listener. The port allocated can be queried via the `local_addr`
133 /// method.
134 ///
135 /// # Example
136 ///
137 /// ```no_run
138 /// # if cfg!(miri) { return } // No `socket` in miri.
139 /// use tokio::net::UdpSocket;
140 /// use std::io;
141 ///
142 /// #[tokio::main]
143 /// async fn main() -> io::Result<()> {
144 /// let sock = UdpSocket::bind("0.0.0.0:8080").await?;
145 /// // use `sock`
146 /// # let _ = sock;
147 /// Ok(())
148 /// }
149 /// ```
150 pub async fn bind<A: ToSocketAddrs>(addr: A) -> io::Result<UdpSocket> {
151 let addrs = to_socket_addrs(addr).await?;
152 let mut last_err = None;
153
154 for addr in addrs {
155 match UdpSocket::bind_addr(addr) {
156 Ok(socket) => return Ok(socket),
157 Err(e) => last_err = Some(e),
158 }
159 }
160
161 Err(last_err.unwrap_or_else(|| {
162 io::Error::new(
163 io::ErrorKind::InvalidInput,
164 "could not resolve to any address",
165 )
166 }))
167 }
168
169 fn bind_addr(addr: SocketAddr) -> io::Result<UdpSocket> {
170 let sys = mio::net::UdpSocket::bind(addr)?;
171 UdpSocket::new(sys)
172 }
173
174 #[track_caller]
175 fn new(socket: mio::net::UdpSocket) -> io::Result<UdpSocket> {
176 let io = PollEvented::new(socket)?;
177 Ok(UdpSocket { io })
178 }
179
180 /// Creates new `UdpSocket` from a previously bound `std::net::UdpSocket`.
181 ///
182 /// This function is intended to be used to wrap a UDP socket from the
183 /// standard library in the Tokio equivalent.
184 ///
185 /// This can be used in conjunction with `socket2`'s `Socket` interface to
186 /// configure a socket before it's handed off, such as setting options like
187 /// `reuse_address` or binding to multiple addresses.
188 ///
189 /// # Notes
190 ///
191 /// The caller is responsible for ensuring that the socket is in
192 /// non-blocking mode. Otherwise all I/O operations on the socket
193 /// will block the thread, which will cause unexpected behavior.
194 /// Non-blocking mode can be set using [`set_nonblocking`].
195 ///
196 /// Passing a listener in blocking mode is always erroneous,
197 /// and the behavior in that case may change in the future.
198 /// For example, it could panic.
199 ///
200 /// [`set_nonblocking`]: std::net::UdpSocket::set_nonblocking
201 ///
202 /// # Panics
203 ///
204 /// This function panics if thread-local runtime is not set.
205 ///
206 /// The runtime is usually set implicitly when this function is called
207 /// from a future driven by a tokio runtime, otherwise runtime can be set
208 /// explicitly with [`Runtime::enter`](crate::runtime::Runtime::enter) function.
209 ///
210 /// # Example
211 ///
212 /// ```no_run
213 /// use tokio::net::UdpSocket;
214 /// # use std::{io, net::SocketAddr};
215 ///
216 /// # #[tokio::main]
217 /// # async fn main() -> io::Result<()> {
218 /// let addr = "0.0.0.0:8080".parse::<SocketAddr>().unwrap();
219 /// let std_sock = std::net::UdpSocket::bind(addr)?;
220 /// std_sock.set_nonblocking(true)?;
221 /// let sock = UdpSocket::from_std(std_sock)?;
222 /// // use `sock`
223 /// # Ok(())
224 /// # }
225 /// ```
226 #[track_caller]
227 pub fn from_std(socket: net::UdpSocket) -> io::Result<UdpSocket> {
228 check_socket_for_blocking(&socket)?;
229
230 let io = mio::net::UdpSocket::from_std(socket);
231 UdpSocket::new(io)
232 }
233
234 /// Turns a [`tokio::net::UdpSocket`] into a [`std::net::UdpSocket`].
235 ///
236 /// The returned [`std::net::UdpSocket`] will have nonblocking mode set as
237 /// `true`. Use [`set_nonblocking`] to change the blocking mode if needed.
238 ///
239 /// # Examples
240 ///
241 /// ```rust,no_run
242 /// use std::error::Error;
243 ///
244 /// #[tokio::main]
245 /// async fn main() -> Result<(), Box<dyn Error>> {
246 /// let tokio_socket = tokio::net::UdpSocket::bind("127.0.0.1:0").await?;
247 /// let std_socket = tokio_socket.into_std()?;
248 /// std_socket.set_nonblocking(false)?;
249 /// Ok(())
250 /// }
251 /// ```
252 ///
253 /// [`tokio::net::UdpSocket`]: UdpSocket
254 /// [`std::net::UdpSocket`]: std::net::UdpSocket
255 /// [`set_nonblocking`]: fn@std::net::UdpSocket::set_nonblocking
256 pub fn into_std(self) -> io::Result<std::net::UdpSocket> {
257 #[cfg(unix)]
258 {
259 use std::os::unix::io::{FromRawFd, IntoRawFd};
260 self.io
261 .into_inner()
262 .map(IntoRawFd::into_raw_fd)
263 .map(|raw_fd| unsafe { std::net::UdpSocket::from_raw_fd(raw_fd) })
264 }
265
266 #[cfg(windows)]
267 {
268 use std::os::windows::io::{FromRawSocket, IntoRawSocket};
269 self.io
270 .into_inner()
271 .map(|io| io.into_raw_socket())
272 .map(|raw_socket| unsafe { std::net::UdpSocket::from_raw_socket(raw_socket) })
273 }
274 }
275
276 fn as_socket(&self) -> socket2::SockRef<'_> {
277 socket2::SockRef::from(self)
278 }
279
280 /// Returns the local address that this socket is bound to.
281 ///
282 /// # Example
283 ///
284 /// ```no_run
285 /// use tokio::net::UdpSocket;
286 /// # use std::{io, net::SocketAddr};
287 ///
288 /// # #[tokio::main]
289 /// # async fn main() -> io::Result<()> {
290 /// let addr = "0.0.0.0:8080".parse::<SocketAddr>().unwrap();
291 /// let sock = UdpSocket::bind(addr).await?;
292 /// // the address the socket is bound to
293 /// let local_addr = sock.local_addr()?;
294 /// # Ok(())
295 /// # }
296 /// ```
297 pub fn local_addr(&self) -> io::Result<SocketAddr> {
298 self.io.local_addr()
299 }
300
301 /// Returns the socket address of the remote peer this socket was connected to.
302 ///
303 /// # Example
304 ///
305 /// ```
306 /// # if cfg!(miri) { return } // No `socket` in miri.
307 /// use tokio::net::UdpSocket;
308 ///
309 /// # use std::{io, net::SocketAddr};
310 /// # #[tokio::main]
311 /// # async fn main() -> io::Result<()> {
312 /// let addr = "0.0.0.0:8080".parse::<SocketAddr>().unwrap();
313 /// let peer = "127.0.0.1:11100".parse::<SocketAddr>().unwrap();
314 /// let sock = UdpSocket::bind(addr).await?;
315 /// sock.connect(peer).await?;
316 /// assert_eq!(peer, sock.peer_addr()?);
317 /// # Ok(())
318 /// # }
319 /// ```
320 pub fn peer_addr(&self) -> io::Result<SocketAddr> {
321 self.io.peer_addr()
322 }
323
324 /// Connects the UDP socket setting the default destination for send() and
325 /// limiting packets that are read via `recv` from the address specified in
326 /// `addr`.
327 ///
328 /// # Example
329 ///
330 /// ```no_run
331 /// use tokio::net::UdpSocket;
332 /// # use std::{io, net::SocketAddr};
333 ///
334 /// # #[tokio::main]
335 /// # async fn main() -> io::Result<()> {
336 /// let sock = UdpSocket::bind("0.0.0.0:8080".parse::<SocketAddr>().unwrap()).await?;
337 ///
338 /// let remote_addr = "127.0.0.1:59600".parse::<SocketAddr>().unwrap();
339 /// sock.connect(remote_addr).await?;
340 /// let mut buf = [0u8; 32];
341 /// // recv from remote_addr
342 /// let len = sock.recv(&mut buf).await?;
343 /// // send to remote_addr
344 /// let _len = sock.send(&buf[..len]).await?;
345 /// # Ok(())
346 /// # }
347 /// ```
348 pub async fn connect<A: ToSocketAddrs>(&self, addr: A) -> io::Result<()> {
349 let addrs = to_socket_addrs(addr).await?;
350 let mut last_err = None;
351
352 for addr in addrs {
353 match self.io.connect(addr) {
354 Ok(()) => return Ok(()),
355 Err(e) => last_err = Some(e),
356 }
357 }
358
359 Err(last_err.unwrap_or_else(|| {
360 io::Error::new(
361 io::ErrorKind::InvalidInput,
362 "could not resolve to any address",
363 )
364 }))
365 }
366
367 /// Waits for any of the requested ready states.
368 ///
369 /// This function is usually paired with `try_recv()` or `try_send()`. It
370 /// can be used to concurrently `recv` / `send` to the same socket on a single
371 /// task without splitting the socket.
372 ///
373 /// The function may complete without the socket being ready. This is a
374 /// false-positive and attempting an operation will return with
375 /// `io::ErrorKind::WouldBlock`. The function can also return with an empty
376 /// [`Ready`] set, so you should always check the returned value and possibly
377 /// wait again if the requested states are not set.
378 ///
379 /// # Cancel safety
380 ///
381 /// This method is cancel safe. Once a readiness event occurs, the method
382 /// will continue to return immediately until the readiness event is
383 /// consumed by an attempt to read or write that fails with `WouldBlock` or
384 /// `Poll::Pending`.
385 ///
386 /// # Examples
387 ///
388 /// Concurrently receive from and send to the socket on the same task
389 /// without splitting.
390 ///
391 /// ```no_run
392 /// use tokio::io::{self, Interest};
393 /// use tokio::net::UdpSocket;
394 ///
395 /// #[tokio::main]
396 /// async fn main() -> io::Result<()> {
397 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
398 /// socket.connect("127.0.0.1:8081").await?;
399 ///
400 /// loop {
401 /// let ready = socket.ready(Interest::READABLE | Interest::WRITABLE).await?;
402 ///
403 /// if ready.is_readable() {
404 /// // The buffer is **not** included in the async task and will only exist
405 /// // on the stack.
406 /// let mut data = [0; 1024];
407 /// match socket.try_recv(&mut data[..]) {
408 /// Ok(n) => {
409 /// println!("received {:?}", &data[..n]);
410 /// }
411 /// // False-positive, continue
412 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {}
413 /// Err(e) => {
414 /// return Err(e);
415 /// }
416 /// }
417 /// }
418 ///
419 /// if ready.is_writable() {
420 /// // Write some data
421 /// match socket.try_send(b"hello world") {
422 /// Ok(n) => {
423 /// println!("sent {} bytes", n);
424 /// }
425 /// // False-positive, continue
426 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {}
427 /// Err(e) => {
428 /// return Err(e);
429 /// }
430 /// }
431 /// }
432 /// }
433 /// }
434 /// ```
435 pub async fn ready(&self, interest: Interest) -> io::Result<Ready> {
436 let event = self.io.registration().readiness(interest).await?;
437 Ok(event.ready)
438 }
439
440 /// Waits for the socket to become writable.
441 ///
442 /// This function is equivalent to `ready(Interest::WRITABLE)` and is
443 /// usually paired with `try_send()` or `try_send_to()`.
444 ///
445 /// The function may complete without the socket being writable. This is a
446 /// false-positive and attempting a `try_send()` will return with
447 /// `io::ErrorKind::WouldBlock`.
448 ///
449 /// # Cancel safety
450 ///
451 /// This method is cancel safe. Once a readiness event occurs, the method
452 /// will continue to return immediately until the readiness event is
453 /// consumed by an attempt to write that fails with `WouldBlock` or
454 /// `Poll::Pending`.
455 ///
456 /// # Examples
457 ///
458 /// ```no_run
459 /// use tokio::net::UdpSocket;
460 /// use std::io;
461 ///
462 /// #[tokio::main]
463 /// async fn main() -> io::Result<()> {
464 /// // Bind socket
465 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
466 /// socket.connect("127.0.0.1:8081").await?;
467 ///
468 /// loop {
469 /// // Wait for the socket to be writable
470 /// socket.writable().await?;
471 ///
472 /// // Try to send data, this may still fail with `WouldBlock`
473 /// // if the readiness event is a false positive.
474 /// match socket.try_send(b"hello world") {
475 /// Ok(n) => {
476 /// break;
477 /// }
478 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
479 /// continue;
480 /// }
481 /// Err(e) => {
482 /// return Err(e);
483 /// }
484 /// }
485 /// }
486 ///
487 /// Ok(())
488 /// }
489 /// ```
490 pub async fn writable(&self) -> io::Result<()> {
491 self.ready(Interest::WRITABLE).await?;
492 Ok(())
493 }
494
495 /// Polls for write/send readiness.
496 ///
497 /// If the udp stream is not currently ready for sending, this method will
498 /// store a clone of the `Waker` from the provided `Context`. When the udp
499 /// stream becomes ready for sending, `Waker::wake` will be called on the
500 /// waker.
501 ///
502 /// Note that on multiple calls to `poll_send_ready` or `poll_send`, only
503 /// the `Waker` from the `Context` passed to the most recent call is
504 /// scheduled to receive a wakeup. (However, `poll_recv_ready` retains a
505 /// second, independent waker.)
506 ///
507 /// This function is intended for cases where creating and pinning a future
508 /// via [`writable`] is not feasible. Where possible, using [`writable`] is
509 /// preferred, as this supports polling from multiple tasks at once.
510 ///
511 /// # Return value
512 ///
513 /// The function returns:
514 ///
515 /// * `Poll::Pending` if the udp stream is not ready for writing.
516 /// * `Poll::Ready(Ok(()))` if the udp stream is ready for writing.
517 /// * `Poll::Ready(Err(e))` if an error is encountered.
518 ///
519 /// # Errors
520 ///
521 /// This function may encounter any standard I/O error except `WouldBlock`.
522 ///
523 /// [`writable`]: method@Self::writable
524 pub fn poll_send_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
525 self.io.registration().poll_write_ready(cx).map_ok(|_| ())
526 }
527
528 /// Sends data on the socket to the remote address that the socket is
529 /// connected to.
530 ///
531 /// The [`connect`] method will connect this socket to a remote address.
532 /// This method will fail if the socket is not connected.
533 ///
534 /// [`connect`]: method@Self::connect
535 ///
536 /// # Return
537 ///
538 /// On success, the number of bytes sent is returned, otherwise, the
539 /// encountered error is returned.
540 ///
541 /// # Cancel safety
542 ///
543 /// This method is cancel safe. If `send` is used as the event in a
544 /// [`tokio::select!`](crate::select) statement and some other branch
545 /// completes first, then it is guaranteed that the message was not sent.
546 ///
547 /// # Examples
548 ///
549 /// ```no_run
550 /// use tokio::io;
551 /// use tokio::net::UdpSocket;
552 ///
553 /// #[tokio::main]
554 /// async fn main() -> io::Result<()> {
555 /// // Bind socket
556 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
557 /// socket.connect("127.0.0.1:8081").await?;
558 ///
559 /// // Send a message
560 /// socket.send(b"hello world").await?;
561 ///
562 /// Ok(())
563 /// }
564 /// ```
565 pub async fn send(&self, buf: &[u8]) -> io::Result<usize> {
566 self.io
567 .registration()
568 .async_io(Interest::WRITABLE, || self.io.send(buf))
569 .await
570 }
571
572 /// Attempts to send data on the socket to the remote address to which it
573 /// was previously `connect`ed.
574 ///
575 /// The [`connect`] method will connect this socket to a remote address.
576 /// This method will fail if the socket is not connected.
577 ///
578 /// Note that on multiple calls to a `poll_*` method in the send direction,
579 /// only the `Waker` from the `Context` passed to the most recent call will
580 /// be scheduled to receive a wakeup.
581 ///
582 /// # Return value
583 ///
584 /// The function returns:
585 ///
586 /// * `Poll::Pending` if the socket is not available to write
587 /// * `Poll::Ready(Ok(n))` `n` is the number of bytes sent
588 /// * `Poll::Ready(Err(e))` if an error is encountered.
589 ///
590 /// # Errors
591 ///
592 /// This function may encounter any standard I/O error except `WouldBlock`.
593 ///
594 /// [`connect`]: method@Self::connect
595 pub fn poll_send(&self, cx: &mut Context<'_>, buf: &[u8]) -> Poll<io::Result<usize>> {
596 self.io
597 .registration()
598 .poll_write_io(cx, || self.io.send(buf))
599 }
600
601 /// Tries to send data on the socket to the remote address to which it is
602 /// connected.
603 ///
604 /// When the socket buffer is full, `Err(io::ErrorKind::WouldBlock)` is
605 /// returned. This function is usually paired with `writable()`.
606 ///
607 /// # Returns
608 ///
609 /// If successful, `Ok(n)` is returned, where `n` is the number of bytes
610 /// sent. If the socket is not ready to send data,
611 /// `Err(ErrorKind::WouldBlock)` is returned.
612 ///
613 /// # Examples
614 ///
615 /// ```no_run
616 /// use tokio::net::UdpSocket;
617 /// use std::io;
618 ///
619 /// #[tokio::main]
620 /// async fn main() -> io::Result<()> {
621 /// // Bind a UDP socket
622 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
623 ///
624 /// // Connect to a peer
625 /// socket.connect("127.0.0.1:8081").await?;
626 ///
627 /// loop {
628 /// // Wait for the socket to be writable
629 /// socket.writable().await?;
630 ///
631 /// // Try to send data, this may still fail with `WouldBlock`
632 /// // if the readiness event is a false positive.
633 /// match socket.try_send(b"hello world") {
634 /// Ok(n) => {
635 /// break;
636 /// }
637 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
638 /// continue;
639 /// }
640 /// Err(e) => {
641 /// return Err(e);
642 /// }
643 /// }
644 /// }
645 ///
646 /// Ok(())
647 /// }
648 /// ```
649 pub fn try_send(&self, buf: &[u8]) -> io::Result<usize> {
650 self.io
651 .registration()
652 .try_io(Interest::WRITABLE, || self.io.send(buf))
653 }
654
655 /// Waits for the socket to become readable.
656 ///
657 /// This function is equivalent to `ready(Interest::READABLE)` and is usually
658 /// paired with `try_recv()`.
659 ///
660 /// The function may complete without the socket being readable. This is a
661 /// false-positive and attempting a `try_recv()` will return with
662 /// `io::ErrorKind::WouldBlock`.
663 ///
664 /// # Cancel safety
665 ///
666 /// This method is cancel safe. Once a readiness event occurs, the method
667 /// will continue to return immediately until the readiness event is
668 /// consumed by an attempt to read that fails with `WouldBlock` or
669 /// `Poll::Pending`.
670 ///
671 /// # Examples
672 ///
673 /// ```no_run
674 /// use tokio::net::UdpSocket;
675 /// use std::io;
676 ///
677 /// #[tokio::main]
678 /// async fn main() -> io::Result<()> {
679 /// // Connect to a peer
680 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
681 /// socket.connect("127.0.0.1:8081").await?;
682 ///
683 /// loop {
684 /// // Wait for the socket to be readable
685 /// socket.readable().await?;
686 ///
687 /// // The buffer is **not** included in the async task and will
688 /// // only exist on the stack.
689 /// let mut buf = [0; 1024];
690 ///
691 /// // Try to recv data, this may still fail with `WouldBlock`
692 /// // if the readiness event is a false positive.
693 /// match socket.try_recv(&mut buf) {
694 /// Ok(n) => {
695 /// println!("GOT {:?}", &buf[..n]);
696 /// break;
697 /// }
698 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
699 /// continue;
700 /// }
701 /// Err(e) => {
702 /// return Err(e);
703 /// }
704 /// }
705 /// }
706 ///
707 /// Ok(())
708 /// }
709 /// ```
710 pub async fn readable(&self) -> io::Result<()> {
711 self.ready(Interest::READABLE).await?;
712 Ok(())
713 }
714
715 /// Polls for read/receive readiness.
716 ///
717 /// If the udp stream is not currently ready for receiving, this method will
718 /// store a clone of the `Waker` from the provided `Context`. When the udp
719 /// socket becomes ready for reading, `Waker::wake` will be called on the
720 /// waker.
721 ///
722 /// Note that on multiple calls to `poll_recv_ready`, `poll_recv` or
723 /// `poll_peek`, only the `Waker` from the `Context` passed to the most
724 /// recent call is scheduled to receive a wakeup. (However,
725 /// `poll_send_ready` retains a second, independent waker.)
726 ///
727 /// This function is intended for cases where creating and pinning a future
728 /// via [`readable`] is not feasible. Where possible, using [`readable`] is
729 /// preferred, as this supports polling from multiple tasks at once.
730 ///
731 /// # Return value
732 ///
733 /// The function returns:
734 ///
735 /// * `Poll::Pending` if the udp stream is not ready for reading.
736 /// * `Poll::Ready(Ok(()))` if the udp stream is ready for reading.
737 /// * `Poll::Ready(Err(e))` if an error is encountered.
738 ///
739 /// # Errors
740 ///
741 /// This function may encounter any standard I/O error except `WouldBlock`.
742 ///
743 /// [`readable`]: method@Self::readable
744 pub fn poll_recv_ready(&self, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
745 self.io.registration().poll_read_ready(cx).map_ok(|_| ())
746 }
747
748 /// Receives a single datagram message on the socket from the remote address
749 /// to which it is connected. On success, returns the number of bytes read.
750 ///
751 /// The function must be called with valid byte array `buf` of sufficient
752 /// size to hold the message bytes. If a message is too long to fit in the
753 /// supplied buffer, excess bytes may be discarded.
754 ///
755 /// The [`connect`] method will connect this socket to a remote address.
756 /// This method will fail if the socket is not connected.
757 ///
758 /// # Cancel safety
759 ///
760 /// This method is cancel safe. If `recv` is used as the event in a
761 /// [`tokio::select!`](crate::select) statement and some other branch
762 /// completes first, it is guaranteed that no messages were received on this
763 /// socket.
764 ///
765 /// [`connect`]: method@Self::connect
766 ///
767 /// ```no_run
768 /// use tokio::net::UdpSocket;
769 /// use std::io;
770 ///
771 /// #[tokio::main]
772 /// async fn main() -> io::Result<()> {
773 /// // Bind socket
774 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
775 /// socket.connect("127.0.0.1:8081").await?;
776 ///
777 /// let mut buf = vec![0; 10];
778 /// let n = socket.recv(&mut buf).await?;
779 ///
780 /// println!("received {} bytes {:?}", n, &buf[..n]);
781 ///
782 /// Ok(())
783 /// }
784 /// ```
785 pub async fn recv(&self, buf: &mut [u8]) -> io::Result<usize> {
786 self.io
787 .registration()
788 .async_io(Interest::READABLE, || self.io.recv(buf))
789 .await
790 }
791
792 /// Attempts to receive a single datagram message on the socket from the remote
793 /// address to which it is `connect`ed.
794 ///
795 /// The [`connect`] method will connect this socket to a remote address. This method
796 /// resolves to an error if the socket is not connected.
797 ///
798 /// Note that on multiple calls to a `poll_*` method in the `recv` direction, only the
799 /// `Waker` from the `Context` passed to the most recent call will be scheduled to
800 /// receive a wakeup.
801 ///
802 /// # Return value
803 ///
804 /// The function returns:
805 ///
806 /// * `Poll::Pending` if the socket is not ready to read
807 /// * `Poll::Ready(Ok(()))` reads data `ReadBuf` if the socket is ready
808 /// * `Poll::Ready(Err(e))` if an error is encountered.
809 ///
810 /// # Errors
811 ///
812 /// This function may encounter any standard I/O error except `WouldBlock`.
813 ///
814 /// [`connect`]: method@Self::connect
815 pub fn poll_recv(&self, cx: &mut Context<'_>, buf: &mut ReadBuf<'_>) -> Poll<io::Result<()>> {
816 #[allow(clippy::blocks_in_conditions)]
817 let n = ready!(self.io.registration().poll_read_io(cx, || {
818 // Safety: will not read the maybe uninitialized bytes.
819 let b = unsafe {
820 &mut *(buf.unfilled_mut() as *mut [std::mem::MaybeUninit<u8>] as *mut [u8])
821 };
822
823 self.io.recv(b)
824 }))?;
825
826 // Safety: We trust `recv` to have filled up `n` bytes in the buffer.
827 unsafe {
828 buf.assume_init(n);
829 }
830 buf.advance(n);
831 Poll::Ready(Ok(()))
832 }
833
834 /// Tries to receive a single datagram message on the socket from the remote
835 /// address to which it is connected. On success, returns the number of
836 /// bytes read.
837 ///
838 /// This method must be called with valid byte array `buf` of sufficient size
839 /// to hold the message bytes. If a message is too long to fit in the
840 /// supplied buffer, excess bytes may be discarded.
841 ///
842 /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is
843 /// returned. This function is usually paired with `readable()`.
844 ///
845 /// # Examples
846 ///
847 /// ```no_run
848 /// use tokio::net::UdpSocket;
849 /// use std::io;
850 ///
851 /// #[tokio::main]
852 /// async fn main() -> io::Result<()> {
853 /// // Connect to a peer
854 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
855 /// socket.connect("127.0.0.1:8081").await?;
856 ///
857 /// loop {
858 /// // Wait for the socket to be readable
859 /// socket.readable().await?;
860 ///
861 /// // The buffer is **not** included in the async task and will
862 /// // only exist on the stack.
863 /// let mut buf = [0; 1024];
864 ///
865 /// // Try to recv data, this may still fail with `WouldBlock`
866 /// // if the readiness event is a false positive.
867 /// match socket.try_recv(&mut buf) {
868 /// Ok(n) => {
869 /// println!("GOT {:?}", &buf[..n]);
870 /// break;
871 /// }
872 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
873 /// continue;
874 /// }
875 /// Err(e) => {
876 /// return Err(e);
877 /// }
878 /// }
879 /// }
880 ///
881 /// Ok(())
882 /// }
883 /// ```
884 pub fn try_recv(&self, buf: &mut [u8]) -> io::Result<usize> {
885 self.io
886 .registration()
887 .try_io(Interest::READABLE, || self.io.recv(buf))
888 }
889
890 cfg_io_util! {
891 /// Tries to receive data from the stream into the provided buffer, advancing the
892 /// buffer's internal cursor, returning how many bytes were read.
893 ///
894 /// This method must be called with valid byte array `buf` of sufficient size
895 /// to hold the message bytes. If a message is too long to fit in the
896 /// supplied buffer, excess bytes may be discarded.
897 ///
898 /// This method can be used even if `buf` is uninitialized.
899 ///
900 /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is
901 /// returned. This function is usually paired with `readable()`.
902 ///
903 /// # Examples
904 ///
905 /// ```no_run
906 /// use tokio::net::UdpSocket;
907 /// use std::io;
908 ///
909 /// #[tokio::main]
910 /// async fn main() -> io::Result<()> {
911 /// // Connect to a peer
912 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
913 /// socket.connect("127.0.0.1:8081").await?;
914 ///
915 /// loop {
916 /// // Wait for the socket to be readable
917 /// socket.readable().await?;
918 ///
919 /// let mut buf = Vec::with_capacity(1024);
920 ///
921 /// // Try to recv data, this may still fail with `WouldBlock`
922 /// // if the readiness event is a false positive.
923 /// match socket.try_recv_buf(&mut buf) {
924 /// Ok(n) => {
925 /// println!("GOT {:?}", &buf[..n]);
926 /// break;
927 /// }
928 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
929 /// continue;
930 /// }
931 /// Err(e) => {
932 /// return Err(e);
933 /// }
934 /// }
935 /// }
936 ///
937 /// Ok(())
938 /// }
939 /// ```
940 pub fn try_recv_buf<B: BufMut>(&self, buf: &mut B) -> io::Result<usize> {
941 self.io.registration().try_io(Interest::READABLE, || {
942 let dst = buf.chunk_mut();
943 let dst =
944 unsafe { &mut *(dst as *mut _ as *mut [std::mem::MaybeUninit<u8>] as *mut [u8]) };
945
946 let n = (*self.io).recv(dst)?;
947
948 // Safety: We trust `UdpSocket::recv` to have filled up `n` bytes in the
949 // buffer.
950 unsafe {
951 buf.advance_mut(n);
952 }
953
954 Ok(n)
955 })
956 }
957
958 /// Receives a single datagram message on the socket from the remote address
959 /// to which it is connected, advancing the buffer's internal cursor,
960 /// returning how many bytes were read.
961 ///
962 /// This method must be called with valid byte array `buf` of sufficient size
963 /// to hold the message bytes. If a message is too long to fit in the
964 /// supplied buffer, excess bytes may be discarded.
965 ///
966 /// This method can be used even if `buf` is uninitialized.
967 ///
968 /// # Examples
969 ///
970 /// ```no_run
971 /// use tokio::net::UdpSocket;
972 /// use std::io;
973 ///
974 /// #[tokio::main]
975 /// async fn main() -> io::Result<()> {
976 /// // Connect to a peer
977 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
978 /// socket.connect("127.0.0.1:8081").await?;
979 ///
980 /// let mut buf = Vec::with_capacity(512);
981 /// let len = socket.recv_buf(&mut buf).await?;
982 ///
983 /// println!("received {} bytes {:?}", len, &buf[..len]);
984 ///
985 /// Ok(())
986 /// }
987 /// ```
988 pub async fn recv_buf<B: BufMut>(&self, buf: &mut B) -> io::Result<usize> {
989 self.io.registration().async_io(Interest::READABLE, || {
990 let dst = buf.chunk_mut();
991 let dst =
992 unsafe { &mut *(dst as *mut _ as *mut [std::mem::MaybeUninit<u8>] as *mut [u8]) };
993
994 let n = (*self.io).recv(dst)?;
995
996 // Safety: We trust `UdpSocket::recv` to have filled up `n` bytes in the
997 // buffer.
998 unsafe {
999 buf.advance_mut(n);
1000 }
1001
1002 Ok(n)
1003 }).await
1004 }
1005
1006 /// Tries to receive a single datagram message on the socket. On success,
1007 /// returns the number of bytes read and the origin.
1008 ///
1009 /// This method must be called with valid byte array `buf` of sufficient size
1010 /// to hold the message bytes. If a message is too long to fit in the
1011 /// supplied buffer, excess bytes may be discarded.
1012 ///
1013 /// This method can be used even if `buf` is uninitialized.
1014 ///
1015 /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is
1016 /// returned. This function is usually paired with `readable()`.
1017 ///
1018 /// # Notes
1019 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1020 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1021 /// Because UDP is stateless and does not validate the origin of a packet,
1022 /// the attacker does not need to be able to intercept traffic in order to interfere.
1023 /// It is important to be aware of this when designing your application-level protocol.
1024 ///
1025 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1026 ///
1027 /// # Examples
1028 ///
1029 /// ```no_run
1030 /// use tokio::net::UdpSocket;
1031 /// use std::io;
1032 ///
1033 /// #[tokio::main]
1034 /// async fn main() -> io::Result<()> {
1035 /// // Connect to a peer
1036 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
1037 ///
1038 /// loop {
1039 /// // Wait for the socket to be readable
1040 /// socket.readable().await?;
1041 ///
1042 /// let mut buf = Vec::with_capacity(1024);
1043 ///
1044 /// // Try to recv data, this may still fail with `WouldBlock`
1045 /// // if the readiness event is a false positive.
1046 /// match socket.try_recv_buf_from(&mut buf) {
1047 /// Ok((n, _addr)) => {
1048 /// println!("GOT {:?}", &buf[..n]);
1049 /// break;
1050 /// }
1051 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
1052 /// continue;
1053 /// }
1054 /// Err(e) => {
1055 /// return Err(e);
1056 /// }
1057 /// }
1058 /// }
1059 ///
1060 /// Ok(())
1061 /// }
1062 /// ```
1063 pub fn try_recv_buf_from<B: BufMut>(&self, buf: &mut B) -> io::Result<(usize, SocketAddr)> {
1064 self.io.registration().try_io(Interest::READABLE, || {
1065 let dst = buf.chunk_mut();
1066 let dst =
1067 unsafe { &mut *(dst as *mut _ as *mut [std::mem::MaybeUninit<u8>] as *mut [u8]) };
1068
1069 let (n, addr) = (*self.io).recv_from(dst)?;
1070
1071 // Safety: We trust `UdpSocket::recv_from` to have filled up `n` bytes in the
1072 // buffer.
1073 unsafe {
1074 buf.advance_mut(n);
1075 }
1076
1077 Ok((n, addr))
1078 })
1079 }
1080
1081 /// Receives a single datagram message on the socket, advancing the
1082 /// buffer's internal cursor, returning how many bytes were read and the origin.
1083 ///
1084 /// This method must be called with valid byte array `buf` of sufficient size
1085 /// to hold the message bytes. If a message is too long to fit in the
1086 /// supplied buffer, excess bytes may be discarded.
1087 ///
1088 /// This method can be used even if `buf` is uninitialized.
1089 ///
1090 /// # Notes
1091 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1092 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1093 /// Because UDP is stateless and does not validate the origin of a packet,
1094 /// the attacker does not need to be able to intercept traffic in order to interfere.
1095 /// It is important to be aware of this when designing your application-level protocol.
1096 ///
1097 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1098 ///
1099 /// # Examples
1100 ///
1101 /// ```no_run
1102 /// use tokio::net::UdpSocket;
1103 /// use std::io;
1104 ///
1105 /// #[tokio::main]
1106 /// async fn main() -> io::Result<()> {
1107 /// // Connect to a peer
1108 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
1109 /// socket.connect("127.0.0.1:8081").await?;
1110 ///
1111 /// let mut buf = Vec::with_capacity(512);
1112 /// let (len, addr) = socket.recv_buf_from(&mut buf).await?;
1113 ///
1114 /// println!("received {:?} bytes from {:?}", len, addr);
1115 ///
1116 /// Ok(())
1117 /// }
1118 /// ```
1119 pub async fn recv_buf_from<B: BufMut>(&self, buf: &mut B) -> io::Result<(usize, SocketAddr)> {
1120 self.io.registration().async_io(Interest::READABLE, || {
1121 let dst = buf.chunk_mut();
1122 let dst =
1123 unsafe { &mut *(dst as *mut _ as *mut [std::mem::MaybeUninit<u8>] as *mut [u8]) };
1124
1125 let (n, addr) = (*self.io).recv_from(dst)?;
1126
1127 // Safety: We trust `UdpSocket::recv_from` to have filled up `n` bytes in the
1128 // buffer.
1129 unsafe {
1130 buf.advance_mut(n);
1131 }
1132
1133 Ok((n,addr))
1134 }).await
1135 }
1136 }
1137
1138 /// Sends data on the socket to the given address. On success, returns the
1139 /// number of bytes written.
1140 ///
1141 /// Address type can be any implementor of [`ToSocketAddrs`] trait. See its
1142 /// documentation for concrete examples.
1143 ///
1144 /// It is possible for `addr` to yield multiple addresses, but `send_to`
1145 /// will only send data to the first address yielded by `addr`.
1146 ///
1147 /// This will return an error when the IP version of the local socket does
1148 /// not match that returned from [`ToSocketAddrs`].
1149 ///
1150 /// [`ToSocketAddrs`]: crate::net::ToSocketAddrs
1151 ///
1152 /// # Cancel safety
1153 ///
1154 /// This method is cancel safe. If `send_to` is used as the event in a
1155 /// [`tokio::select!`](crate::select) statement and some other branch
1156 /// completes first, then it is guaranteed that the message was not sent.
1157 ///
1158 /// # Example
1159 ///
1160 /// ```no_run
1161 /// use tokio::net::UdpSocket;
1162 /// use std::io;
1163 ///
1164 /// #[tokio::main]
1165 /// async fn main() -> io::Result<()> {
1166 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
1167 /// let len = socket.send_to(b"hello world", "127.0.0.1:8081").await?;
1168 ///
1169 /// println!("Sent {} bytes", len);
1170 ///
1171 /// Ok(())
1172 /// }
1173 /// ```
1174 pub async fn send_to<A: ToSocketAddrs>(&self, buf: &[u8], addr: A) -> io::Result<usize> {
1175 let mut addrs = to_socket_addrs(addr).await?;
1176
1177 match addrs.next() {
1178 Some(target) => self.send_to_addr(buf, target).await,
1179 None => Err(io::Error::new(
1180 io::ErrorKind::InvalidInput,
1181 "no addresses to send data to",
1182 )),
1183 }
1184 }
1185
1186 /// Attempts to send data on the socket to a given address.
1187 ///
1188 /// Note that on multiple calls to a `poll_*` method in the send direction, only the
1189 /// `Waker` from the `Context` passed to the most recent call will be scheduled to
1190 /// receive a wakeup.
1191 ///
1192 /// # Return value
1193 ///
1194 /// The function returns:
1195 ///
1196 /// * `Poll::Pending` if the socket is not ready to write
1197 /// * `Poll::Ready(Ok(n))` `n` is the number of bytes sent.
1198 /// * `Poll::Ready(Err(e))` if an error is encountered.
1199 ///
1200 /// # Errors
1201 ///
1202 /// This function may encounter any standard I/O error except `WouldBlock`.
1203 pub fn poll_send_to(
1204 &self,
1205 cx: &mut Context<'_>,
1206 buf: &[u8],
1207 target: SocketAddr,
1208 ) -> Poll<io::Result<usize>> {
1209 self.io
1210 .registration()
1211 .poll_write_io(cx, || self.io.send_to(buf, target))
1212 }
1213
1214 /// Tries to send data on the socket to the given address, but if the send is
1215 /// blocked this will return right away.
1216 ///
1217 /// This function is usually paired with `writable()`.
1218 ///
1219 /// # Returns
1220 ///
1221 /// If successful, returns the number of bytes sent
1222 ///
1223 /// Users should ensure that when the remote cannot receive, the
1224 /// [`ErrorKind::WouldBlock`] is properly handled. An error can also occur
1225 /// if the IP version of the socket does not match that of `target`.
1226 ///
1227 /// [`ErrorKind::WouldBlock`]: std::io::ErrorKind::WouldBlock
1228 ///
1229 /// # Example
1230 ///
1231 /// ```no_run
1232 /// use tokio::net::UdpSocket;
1233 /// use std::error::Error;
1234 /// use std::io;
1235 ///
1236 /// #[tokio::main]
1237 /// async fn main() -> Result<(), Box<dyn Error>> {
1238 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
1239 ///
1240 /// let dst = "127.0.0.1:8081".parse()?;
1241 ///
1242 /// loop {
1243 /// socket.writable().await?;
1244 ///
1245 /// match socket.try_send_to(&b"hello world"[..], dst) {
1246 /// Ok(sent) => {
1247 /// println!("sent {} bytes", sent);
1248 /// break;
1249 /// }
1250 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
1251 /// // Writable false positive.
1252 /// continue;
1253 /// }
1254 /// Err(e) => return Err(e.into()),
1255 /// }
1256 /// }
1257 ///
1258 /// Ok(())
1259 /// }
1260 /// ```
1261 pub fn try_send_to(&self, buf: &[u8], target: SocketAddr) -> io::Result<usize> {
1262 self.io
1263 .registration()
1264 .try_io(Interest::WRITABLE, || self.io.send_to(buf, target))
1265 }
1266
1267 async fn send_to_addr(&self, buf: &[u8], target: SocketAddr) -> io::Result<usize> {
1268 self.io
1269 .registration()
1270 .async_io(Interest::WRITABLE, || self.io.send_to(buf, target))
1271 .await
1272 }
1273
1274 /// Receives a single datagram message on the socket. On success, returns
1275 /// the number of bytes read and the origin.
1276 ///
1277 /// The function must be called with valid byte array `buf` of sufficient
1278 /// size to hold the message bytes. If a message is too long to fit in the
1279 /// supplied buffer, excess bytes may be discarded.
1280 ///
1281 /// # Cancel safety
1282 ///
1283 /// This method is cancel safe. If `recv_from` is used as the event in a
1284 /// [`tokio::select!`](crate::select) statement and some other branch
1285 /// completes first, it is guaranteed that no messages were received on this
1286 /// socket.
1287 ///
1288 /// # Example
1289 ///
1290 /// ```no_run
1291 /// use tokio::net::UdpSocket;
1292 /// use std::io;
1293 ///
1294 /// #[tokio::main]
1295 /// async fn main() -> io::Result<()> {
1296 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
1297 ///
1298 /// let mut buf = vec![0u8; 32];
1299 /// let (len, addr) = socket.recv_from(&mut buf).await?;
1300 ///
1301 /// println!("received {:?} bytes from {:?}", len, addr);
1302 ///
1303 /// Ok(())
1304 /// }
1305 /// ```
1306 ///
1307 /// # Notes
1308 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1309 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1310 /// Because UDP is stateless and does not validate the origin of a packet,
1311 /// the attacker does not need to be able to intercept traffic in order to interfere.
1312 /// It is important to be aware of this when designing your application-level protocol.
1313 ///
1314 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1315 pub async fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
1316 self.io
1317 .registration()
1318 .async_io(Interest::READABLE, || self.io.recv_from(buf))
1319 .await
1320 }
1321
1322 /// Attempts to receive a single datagram on the socket.
1323 ///
1324 /// Note that on multiple calls to a `poll_*` method in the `recv` direction, only the
1325 /// `Waker` from the `Context` passed to the most recent call will be scheduled to
1326 /// receive a wakeup.
1327 ///
1328 /// # Return value
1329 ///
1330 /// The function returns:
1331 ///
1332 /// * `Poll::Pending` if the socket is not ready to read
1333 /// * `Poll::Ready(Ok(addr))` reads data from `addr` into `ReadBuf` if the socket is ready
1334 /// * `Poll::Ready(Err(e))` if an error is encountered.
1335 ///
1336 /// # Errors
1337 ///
1338 /// This function may encounter any standard I/O error except `WouldBlock`.
1339 ///
1340 /// # Notes
1341 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1342 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1343 /// Because UDP is stateless and does not validate the origin of a packet,
1344 /// the attacker does not need to be able to intercept traffic in order to interfere.
1345 /// It is important to be aware of this when designing your application-level protocol.
1346 ///
1347 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1348 pub fn poll_recv_from(
1349 &self,
1350 cx: &mut Context<'_>,
1351 buf: &mut ReadBuf<'_>,
1352 ) -> Poll<io::Result<SocketAddr>> {
1353 #[allow(clippy::blocks_in_conditions)]
1354 let (n, addr) = ready!(self.io.registration().poll_read_io(cx, || {
1355 // Safety: will not read the maybe uninitialized bytes.
1356 let b = unsafe {
1357 &mut *(buf.unfilled_mut() as *mut [std::mem::MaybeUninit<u8>] as *mut [u8])
1358 };
1359
1360 self.io.recv_from(b)
1361 }))?;
1362
1363 // Safety: We trust `recv` to have filled up `n` bytes in the buffer.
1364 unsafe {
1365 buf.assume_init(n);
1366 }
1367 buf.advance(n);
1368 Poll::Ready(Ok(addr))
1369 }
1370
1371 /// Tries to receive a single datagram message on the socket. On success,
1372 /// returns the number of bytes read and the origin.
1373 ///
1374 /// This method must be called with valid byte array `buf` of sufficient size
1375 /// to hold the message bytes. If a message is too long to fit in the
1376 /// supplied buffer, excess bytes may be discarded.
1377 ///
1378 /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is
1379 /// returned. This function is usually paired with `readable()`.
1380 ///
1381 /// # Notes
1382 ///
1383 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1384 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1385 /// Because UDP is stateless and does not validate the origin of a packet,
1386 /// the attacker does not need to be able to intercept traffic in order to interfere.
1387 /// It is important to be aware of this when designing your application-level protocol.
1388 ///
1389 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1390 ///
1391 /// # Examples
1392 ///
1393 /// ```no_run
1394 /// use tokio::net::UdpSocket;
1395 /// use std::io;
1396 ///
1397 /// #[tokio::main]
1398 /// async fn main() -> io::Result<()> {
1399 /// // Connect to a peer
1400 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
1401 ///
1402 /// loop {
1403 /// // Wait for the socket to be readable
1404 /// socket.readable().await?;
1405 ///
1406 /// // The buffer is **not** included in the async task and will
1407 /// // only exist on the stack.
1408 /// let mut buf = [0; 1024];
1409 ///
1410 /// // Try to recv data, this may still fail with `WouldBlock`
1411 /// // if the readiness event is a false positive.
1412 /// match socket.try_recv_from(&mut buf) {
1413 /// Ok((n, _addr)) => {
1414 /// println!("GOT {:?}", &buf[..n]);
1415 /// break;
1416 /// }
1417 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
1418 /// continue;
1419 /// }
1420 /// Err(e) => {
1421 /// return Err(e);
1422 /// }
1423 /// }
1424 /// }
1425 ///
1426 /// Ok(())
1427 /// }
1428 /// ```
1429 pub fn try_recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
1430 self.io
1431 .registration()
1432 .try_io(Interest::READABLE, || self.io.recv_from(buf))
1433 }
1434
1435 /// Tries to read or write from the socket using a user-provided IO operation.
1436 ///
1437 /// If the socket is ready, the provided closure is called. The closure
1438 /// should attempt to perform IO operation on the socket by manually
1439 /// calling the appropriate syscall. If the operation fails because the
1440 /// socket is not actually ready, then the closure should return a
1441 /// `WouldBlock` error and the readiness flag is cleared. The return value
1442 /// of the closure is then returned by `try_io`.
1443 ///
1444 /// If the socket is not ready, then the closure is not called
1445 /// and a `WouldBlock` error is returned.
1446 ///
1447 /// The closure should only return a `WouldBlock` error if it has performed
1448 /// an IO operation on the socket that failed due to the socket not being
1449 /// ready. Returning a `WouldBlock` error in any other situation will
1450 /// incorrectly clear the readiness flag, which can cause the socket to
1451 /// behave incorrectly.
1452 ///
1453 /// The closure should not perform the IO operation using any of the methods
1454 /// defined on the Tokio `UdpSocket` type, as this will mess with the
1455 /// readiness flag and can cause the socket to behave incorrectly.
1456 ///
1457 /// This method is not intended to be used with combined interests.
1458 /// The closure should perform only one type of IO operation, so it should not
1459 /// require more than one ready state. This method may panic or sleep forever
1460 /// if it is called with a combined interest.
1461 ///
1462 /// Usually, [`readable()`], [`writable()`] or [`ready()`] is used with this function.
1463 ///
1464 /// [`readable()`]: UdpSocket::readable()
1465 /// [`writable()`]: UdpSocket::writable()
1466 /// [`ready()`]: UdpSocket::ready()
1467 pub fn try_io<R>(
1468 &self,
1469 interest: Interest,
1470 f: impl FnOnce() -> io::Result<R>,
1471 ) -> io::Result<R> {
1472 self.io
1473 .registration()
1474 .try_io(interest, || self.io.try_io(f))
1475 }
1476
1477 /// Reads or writes from the socket using a user-provided IO operation.
1478 ///
1479 /// The readiness of the socket is awaited and when the socket is ready,
1480 /// the provided closure is called. The closure should attempt to perform
1481 /// IO operation on the socket by manually calling the appropriate syscall.
1482 /// If the operation fails because the socket is not actually ready,
1483 /// then the closure should return a `WouldBlock` error. In such case the
1484 /// readiness flag is cleared and the socket readiness is awaited again.
1485 /// This loop is repeated until the closure returns an `Ok` or an error
1486 /// other than `WouldBlock`.
1487 ///
1488 /// The closure should only return a `WouldBlock` error if it has performed
1489 /// an IO operation on the socket that failed due to the socket not being
1490 /// ready. Returning a `WouldBlock` error in any other situation will
1491 /// incorrectly clear the readiness flag, which can cause the socket to
1492 /// behave incorrectly.
1493 ///
1494 /// The closure should not perform the IO operation using any of the methods
1495 /// defined on the Tokio `UdpSocket` type, as this will mess with the
1496 /// readiness flag and can cause the socket to behave incorrectly.
1497 ///
1498 /// This method is not intended to be used with combined interests.
1499 /// The closure should perform only one type of IO operation, so it should not
1500 /// require more than one ready state. This method may panic or sleep forever
1501 /// if it is called with a combined interest.
1502 pub async fn async_io<R>(
1503 &self,
1504 interest: Interest,
1505 mut f: impl FnMut() -> io::Result<R>,
1506 ) -> io::Result<R> {
1507 self.io
1508 .registration()
1509 .async_io(interest, || self.io.try_io(&mut f))
1510 .await
1511 }
1512
1513 /// Receives a single datagram from the connected address without removing it from the queue.
1514 /// On success, returns the number of bytes read from whence the data came.
1515 ///
1516 /// # Notes
1517 ///
1518 /// On Windows, if the data is larger than the buffer specified, the buffer
1519 /// is filled with the first part of the data, and `peek_from` returns the error
1520 /// `WSAEMSGSIZE(10040)`. The excess data is lost.
1521 /// Make sure to always use a sufficiently large buffer to hold the
1522 /// maximum UDP packet size, which can be up to 65536 bytes in size.
1523 ///
1524 /// MacOS will return an error if you pass a zero-sized buffer.
1525 ///
1526 /// If you're merely interested in learning the sender of the data at the head of the queue,
1527 /// try [`peek_sender`].
1528 ///
1529 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1530 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1531 /// Because UDP is stateless and does not validate the origin of a packet,
1532 /// the attacker does not need to be able to intercept traffic in order to interfere.
1533 /// It is important to be aware of this when designing your application-level protocol.
1534 ///
1535 /// # Examples
1536 ///
1537 /// ```no_run
1538 /// use tokio::net::UdpSocket;
1539 /// use std::io;
1540 ///
1541 /// #[tokio::main]
1542 /// async fn main() -> io::Result<()> {
1543 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
1544 ///
1545 /// let mut buf = vec![0u8; 32];
1546 /// let len = socket.peek(&mut buf).await?;
1547 ///
1548 /// println!("peeked {:?} bytes", len);
1549 ///
1550 /// Ok(())
1551 /// }
1552 /// ```
1553 ///
1554 /// [`peek_sender`]: method@Self::peek_sender
1555 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1556 pub async fn peek(&self, buf: &mut [u8]) -> io::Result<usize> {
1557 self.io
1558 .registration()
1559 .async_io(Interest::READABLE, || self.io.peek(buf))
1560 .await
1561 }
1562
1563 /// Receives data from the connected address, without removing it from the input queue.
1564 /// On success, returns the sending address of the datagram.
1565 ///
1566 /// # Notes
1567 ///
1568 /// Note that on multiple calls to a `poll_*` method in the `recv` direction, only the
1569 /// `Waker` from the `Context` passed to the most recent call will be scheduled to
1570 /// receive a wakeup
1571 ///
1572 /// On Windows, if the data is larger than the buffer specified, the buffer
1573 /// is filled with the first part of the data, and peek returns the error
1574 /// `WSAEMSGSIZE(10040)`. The excess data is lost.
1575 /// Make sure to always use a sufficiently large buffer to hold the
1576 /// maximum UDP packet size, which can be up to 65536 bytes in size.
1577 ///
1578 /// MacOS will return an error if you pass a zero-sized buffer.
1579 ///
1580 /// If you're merely interested in learning the sender of the data at the head of the queue,
1581 /// try [`poll_peek_sender`].
1582 ///
1583 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1584 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1585 /// Because UDP is stateless and does not validate the origin of a packet,
1586 /// the attacker does not need to be able to intercept traffic in order to interfere.
1587 /// It is important to be aware of this when designing your application-level protocol.
1588 ///
1589 /// # Return value
1590 ///
1591 /// The function returns:
1592 ///
1593 /// * `Poll::Pending` if the socket is not ready to read
1594 /// * `Poll::Ready(Ok(()))` reads data into `ReadBuf` if the socket is ready
1595 /// * `Poll::Ready(Err(e))` if an error is encountered.
1596 ///
1597 /// # Errors
1598 ///
1599 /// This function may encounter any standard I/O error except `WouldBlock`.
1600 ///
1601 /// [`poll_peek_sender`]: method@Self::poll_peek_sender
1602 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1603 pub fn poll_peek(&self, cx: &mut Context<'_>, buf: &mut ReadBuf<'_>) -> Poll<io::Result<()>> {
1604 #[allow(clippy::blocks_in_conditions)]
1605 let n = ready!(self.io.registration().poll_read_io(cx, || {
1606 // Safety: will not read the maybe uninitialized bytes.
1607 let b = unsafe {
1608 &mut *(buf.unfilled_mut() as *mut [std::mem::MaybeUninit<u8>] as *mut [u8])
1609 };
1610
1611 self.io.peek(b)
1612 }))?;
1613
1614 // Safety: We trust `recv` to have filled up `n` bytes in the buffer.
1615 unsafe {
1616 buf.assume_init(n);
1617 }
1618 buf.advance(n);
1619 Poll::Ready(Ok(()))
1620 }
1621
1622 /// Tries to receive data on the connected address without removing it from the input queue.
1623 /// On success, returns the number of bytes read.
1624 ///
1625 /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is
1626 /// returned. This function is usually paired with `readable()`.
1627 ///
1628 /// # Notes
1629 ///
1630 /// On Windows, if the data is larger than the buffer specified, the buffer
1631 /// is filled with the first part of the data, and peek returns the error
1632 /// `WSAEMSGSIZE(10040)`. The excess data is lost.
1633 /// Make sure to always use a sufficiently large buffer to hold the
1634 /// maximum UDP packet size, which can be up to 65536 bytes in size.
1635 ///
1636 /// MacOS will return an error if you pass a zero-sized buffer.
1637 ///
1638 /// If you're merely interested in learning the sender of the data at the head of the queue,
1639 /// try [`try_peek_sender`].
1640 ///
1641 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1642 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1643 /// Because UDP is stateless and does not validate the origin of a packet,
1644 /// the attacker does not need to be able to intercept traffic in order to interfere.
1645 /// It is important to be aware of this when designing your application-level protocol.
1646 ///
1647 /// [`try_peek_sender`]: method@Self::try_peek_sender
1648 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1649 pub fn try_peek(&self, buf: &mut [u8]) -> io::Result<usize> {
1650 self.io
1651 .registration()
1652 .try_io(Interest::READABLE, || self.io.peek(buf))
1653 }
1654
1655 /// Receives data from the socket, without removing it from the input queue.
1656 /// On success, returns the number of bytes read and the address from whence
1657 /// the data came.
1658 ///
1659 /// # Notes
1660 ///
1661 /// On Windows, if the data is larger than the buffer specified, the buffer
1662 /// is filled with the first part of the data, and `peek_from` returns the error
1663 /// `WSAEMSGSIZE(10040)`. The excess data is lost.
1664 /// Make sure to always use a sufficiently large buffer to hold the
1665 /// maximum UDP packet size, which can be up to 65536 bytes in size.
1666 ///
1667 /// MacOS will return an error if you pass a zero-sized buffer.
1668 ///
1669 /// If you're merely interested in learning the sender of the data at the head of the queue,
1670 /// try [`peek_sender`].
1671 ///
1672 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1673 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1674 /// Because UDP is stateless and does not validate the origin of a packet,
1675 /// the attacker does not need to be able to intercept traffic in order to interfere.
1676 /// It is important to be aware of this when designing your application-level protocol.
1677 ///
1678 /// # Examples
1679 ///
1680 /// ```no_run
1681 /// use tokio::net::UdpSocket;
1682 /// use std::io;
1683 ///
1684 /// #[tokio::main]
1685 /// async fn main() -> io::Result<()> {
1686 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?;
1687 ///
1688 /// let mut buf = vec![0u8; 32];
1689 /// let (len, addr) = socket.peek_from(&mut buf).await?;
1690 ///
1691 /// println!("peeked {:?} bytes from {:?}", len, addr);
1692 ///
1693 /// Ok(())
1694 /// }
1695 /// ```
1696 ///
1697 /// [`peek_sender`]: method@Self::peek_sender
1698 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1699 pub async fn peek_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
1700 self.io
1701 .registration()
1702 .async_io(Interest::READABLE, || self.io.peek_from(buf))
1703 .await
1704 }
1705
1706 /// Receives data from the socket, without removing it from the input queue.
1707 /// On success, returns the sending address of the datagram.
1708 ///
1709 /// # Notes
1710 ///
1711 /// Note that on multiple calls to a `poll_*` method in the `recv` direction, only the
1712 /// `Waker` from the `Context` passed to the most recent call will be scheduled to
1713 /// receive a wakeup
1714 ///
1715 /// On Windows, if the data is larger than the buffer specified, the buffer
1716 /// is filled with the first part of the data, and peek returns the error
1717 /// `WSAEMSGSIZE(10040)`. The excess data is lost.
1718 /// Make sure to always use a sufficiently large buffer to hold the
1719 /// maximum UDP packet size, which can be up to 65536 bytes in size.
1720 ///
1721 /// MacOS will return an error if you pass a zero-sized buffer.
1722 ///
1723 /// If you're merely interested in learning the sender of the data at the head of the queue,
1724 /// try [`poll_peek_sender`].
1725 ///
1726 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1727 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1728 /// Because UDP is stateless and does not validate the origin of a packet,
1729 /// the attacker does not need to be able to intercept traffic in order to interfere.
1730 /// It is important to be aware of this when designing your application-level protocol.
1731 ///
1732 /// # Return value
1733 ///
1734 /// The function returns:
1735 ///
1736 /// * `Poll::Pending` if the socket is not ready to read
1737 /// * `Poll::Ready(Ok(addr))` reads data from `addr` into `ReadBuf` if the socket is ready
1738 /// * `Poll::Ready(Err(e))` if an error is encountered.
1739 ///
1740 /// # Errors
1741 ///
1742 /// This function may encounter any standard I/O error except `WouldBlock`.
1743 ///
1744 /// [`poll_peek_sender`]: method@Self::poll_peek_sender
1745 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1746 pub fn poll_peek_from(
1747 &self,
1748 cx: &mut Context<'_>,
1749 buf: &mut ReadBuf<'_>,
1750 ) -> Poll<io::Result<SocketAddr>> {
1751 #[allow(clippy::blocks_in_conditions)]
1752 let (n, addr) = ready!(self.io.registration().poll_read_io(cx, || {
1753 // Safety: will not read the maybe uninitialized bytes.
1754 let b = unsafe {
1755 &mut *(buf.unfilled_mut() as *mut [std::mem::MaybeUninit<u8>] as *mut [u8])
1756 };
1757
1758 self.io.peek_from(b)
1759 }))?;
1760
1761 // Safety: We trust `recv` to have filled up `n` bytes in the buffer.
1762 unsafe {
1763 buf.assume_init(n);
1764 }
1765 buf.advance(n);
1766 Poll::Ready(Ok(addr))
1767 }
1768
1769 /// Tries to receive data on the socket without removing it from the input queue.
1770 /// On success, returns the number of bytes read and the sending address of the
1771 /// datagram.
1772 ///
1773 /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is
1774 /// returned. This function is usually paired with `readable()`.
1775 ///
1776 /// # Notes
1777 ///
1778 /// On Windows, if the data is larger than the buffer specified, the buffer
1779 /// is filled with the first part of the data, and peek returns the error
1780 /// `WSAEMSGSIZE(10040)`. The excess data is lost.
1781 /// Make sure to always use a sufficiently large buffer to hold the
1782 /// maximum UDP packet size, which can be up to 65536 bytes in size.
1783 ///
1784 /// MacOS will return an error if you pass a zero-sized buffer.
1785 ///
1786 /// If you're merely interested in learning the sender of the data at the head of the queue,
1787 /// try [`try_peek_sender`].
1788 ///
1789 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1790 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1791 /// Because UDP is stateless and does not validate the origin of a packet,
1792 /// the attacker does not need to be able to intercept traffic in order to interfere.
1793 /// It is important to be aware of this when designing your application-level protocol.
1794 ///
1795 /// [`try_peek_sender`]: method@Self::try_peek_sender
1796 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1797 pub fn try_peek_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
1798 self.io
1799 .registration()
1800 .try_io(Interest::READABLE, || self.io.peek_from(buf))
1801 }
1802
1803 /// Retrieve the sender of the data at the head of the input queue, waiting if empty.
1804 ///
1805 /// This is equivalent to calling [`peek_from`] with a zero-sized buffer,
1806 /// but suppresses the `WSAEMSGSIZE` error on Windows and the "invalid argument" error on macOS.
1807 ///
1808 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1809 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1810 /// Because UDP is stateless and does not validate the origin of a packet,
1811 /// the attacker does not need to be able to intercept traffic in order to interfere.
1812 /// It is important to be aware of this when designing your application-level protocol.
1813 ///
1814 /// [`peek_from`]: method@Self::peek_from
1815 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1816 pub async fn peek_sender(&self) -> io::Result<SocketAddr> {
1817 self.io
1818 .registration()
1819 .async_io(Interest::READABLE, || self.peek_sender_inner())
1820 .await
1821 }
1822
1823 /// Retrieve the sender of the data at the head of the input queue,
1824 /// scheduling a wakeup if empty.
1825 ///
1826 /// This is equivalent to calling [`poll_peek_from`] with a zero-sized buffer,
1827 /// but suppresses the `WSAEMSGSIZE` error on Windows and the "invalid argument" error on macOS.
1828 ///
1829 /// # Notes
1830 ///
1831 /// Note that on multiple calls to a `poll_*` method in the `recv` direction, only the
1832 /// `Waker` from the `Context` passed to the most recent call will be scheduled to
1833 /// receive a wakeup.
1834 ///
1835 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1836 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1837 /// Because UDP is stateless and does not validate the origin of a packet,
1838 /// the attacker does not need to be able to intercept traffic in order to interfere.
1839 /// It is important to be aware of this when designing your application-level protocol.
1840 ///
1841 /// [`poll_peek_from`]: method@Self::poll_peek_from
1842 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1843 pub fn poll_peek_sender(&self, cx: &mut Context<'_>) -> Poll<io::Result<SocketAddr>> {
1844 self.io
1845 .registration()
1846 .poll_read_io(cx, || self.peek_sender_inner())
1847 }
1848
1849 /// Try to retrieve the sender of the data at the head of the input queue.
1850 ///
1851 /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is
1852 /// returned. This function is usually paired with `readable()`.
1853 ///
1854 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively
1855 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack].
1856 /// Because UDP is stateless and does not validate the origin of a packet,
1857 /// the attacker does not need to be able to intercept traffic in order to interfere.
1858 /// It is important to be aware of this when designing your application-level protocol.
1859 ///
1860 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection
1861 pub fn try_peek_sender(&self) -> io::Result<SocketAddr> {
1862 self.io
1863 .registration()
1864 .try_io(Interest::READABLE, || self.peek_sender_inner())
1865 }
1866
1867 #[inline]
1868 fn peek_sender_inner(&self) -> io::Result<SocketAddr> {
1869 self.io.try_io(|| {
1870 self.as_socket()
1871 .peek_sender()?
1872 // May be `None` if the platform doesn't populate the sender for some reason.
1873 // In testing, that only occurred on macOS if you pass a zero-sized buffer,
1874 // but the implementation of `Socket::peek_sender()` covers that.
1875 .as_socket()
1876 .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "sender not available"))
1877 })
1878 }
1879
1880 /// Gets the value of the `SO_BROADCAST` option for this socket.
1881 ///
1882 /// For more information about this option, see [`set_broadcast`].
1883 ///
1884 /// [`set_broadcast`]: method@Self::set_broadcast
1885 pub fn broadcast(&self) -> io::Result<bool> {
1886 self.io.broadcast()
1887 }
1888
1889 /// Sets the value of the `SO_BROADCAST` option for this socket.
1890 ///
1891 /// When enabled, this socket is allowed to send packets to a broadcast
1892 /// address.
1893 pub fn set_broadcast(&self, on: bool) -> io::Result<()> {
1894 self.io.set_broadcast(on)
1895 }
1896
1897 /// Gets the value of the `IP_MULTICAST_LOOP` option for this socket.
1898 ///
1899 /// For more information about this option, see [`set_multicast_loop_v4`].
1900 ///
1901 /// [`set_multicast_loop_v4`]: method@Self::set_multicast_loop_v4
1902 pub fn multicast_loop_v4(&self) -> io::Result<bool> {
1903 self.io.multicast_loop_v4()
1904 }
1905
1906 /// Sets the value of the `IP_MULTICAST_LOOP` option for this socket.
1907 ///
1908 /// If enabled, multicast packets will be looped back to the local socket.
1909 ///
1910 /// # Note
1911 ///
1912 /// This may not have any affect on IPv6 sockets.
1913 pub fn set_multicast_loop_v4(&self, on: bool) -> io::Result<()> {
1914 self.io.set_multicast_loop_v4(on)
1915 }
1916
1917 /// Gets the value of the `IP_MULTICAST_TTL` option for this socket.
1918 ///
1919 /// For more information about this option, see [`set_multicast_ttl_v4`].
1920 ///
1921 /// [`set_multicast_ttl_v4`]: method@Self::set_multicast_ttl_v4
1922 pub fn multicast_ttl_v4(&self) -> io::Result<u32> {
1923 self.io.multicast_ttl_v4()
1924 }
1925
1926 /// Sets the value of the `IP_MULTICAST_TTL` option for this socket.
1927 ///
1928 /// Indicates the time-to-live value of outgoing multicast packets for
1929 /// this socket. The default value is 1 which means that multicast packets
1930 /// don't leave the local network unless explicitly requested.
1931 ///
1932 /// # Note
1933 ///
1934 /// This may not have any affect on IPv6 sockets.
1935 pub fn set_multicast_ttl_v4(&self, ttl: u32) -> io::Result<()> {
1936 self.io.set_multicast_ttl_v4(ttl)
1937 }
1938
1939 /// Gets the value of the `IPV6_MULTICAST_LOOP` option for this socket.
1940 ///
1941 /// For more information about this option, see [`set_multicast_loop_v6`].
1942 ///
1943 /// [`set_multicast_loop_v6`]: method@Self::set_multicast_loop_v6
1944 pub fn multicast_loop_v6(&self) -> io::Result<bool> {
1945 self.io.multicast_loop_v6()
1946 }
1947
1948 /// Sets the value of the `IPV6_MULTICAST_LOOP` option for this socket.
1949 ///
1950 /// Controls whether this socket sees the multicast packets it sends itself.
1951 ///
1952 /// # Note
1953 ///
1954 /// This may not have any affect on IPv4 sockets.
1955 pub fn set_multicast_loop_v6(&self, on: bool) -> io::Result<()> {
1956 self.io.set_multicast_loop_v6(on)
1957 }
1958
1959 /// Gets the value of the `IP_TTL` option for this socket.
1960 ///
1961 /// For more information about this option, see [`set_ttl`].
1962 ///
1963 /// [`set_ttl`]: method@Self::set_ttl
1964 ///
1965 /// # Examples
1966 ///
1967 /// ```no_run
1968 /// use tokio::net::UdpSocket;
1969 /// # use std::io;
1970 ///
1971 /// # async fn dox() -> io::Result<()> {
1972 /// let sock = UdpSocket::bind("127.0.0.1:8080").await?;
1973 ///
1974 /// println!("{:?}", sock.ttl()?);
1975 /// # Ok(())
1976 /// # }
1977 /// ```
1978 pub fn ttl(&self) -> io::Result<u32> {
1979 self.io.ttl()
1980 }
1981
1982 /// Sets the value for the `IP_TTL` option on this socket.
1983 ///
1984 /// This value sets the time-to-live field that is used in every packet sent
1985 /// from this socket.
1986 ///
1987 /// # Examples
1988 ///
1989 /// ```no_run
1990 /// use tokio::net::UdpSocket;
1991 /// # use std::io;
1992 ///
1993 /// # async fn dox() -> io::Result<()> {
1994 /// let sock = UdpSocket::bind("127.0.0.1:8080").await?;
1995 /// sock.set_ttl(60)?;
1996 ///
1997 /// # Ok(())
1998 /// # }
1999 /// ```
2000 pub fn set_ttl(&self, ttl: u32) -> io::Result<()> {
2001 self.io.set_ttl(ttl)
2002 }
2003
2004 /// Gets the value of the `IP_TOS` option for this socket.
2005 ///
2006 /// For more information about this option, see [`set_tos`].
2007 ///
2008 /// **NOTE:** On Windows, `IP_TOS` is only supported on [Windows 8+ or
2009 /// Windows Server 2012+.](https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options)
2010 ///
2011 /// [`set_tos`]: Self::set_tos
2012 // https://docs.rs/socket2/0.5.3/src/socket2/socket.rs.html#1464
2013 #[cfg(not(any(
2014 target_os = "fuchsia",
2015 target_os = "redox",
2016 target_os = "solaris",
2017 target_os = "illumos",
2018 target_os = "haiku"
2019 )))]
2020 #[cfg_attr(
2021 docsrs,
2022 doc(cfg(not(any(
2023 target_os = "fuchsia",
2024 target_os = "redox",
2025 target_os = "solaris",
2026 target_os = "illumos",
2027 target_os = "haiku"
2028 ))))
2029 )]
2030 pub fn tos(&self) -> io::Result<u32> {
2031 self.as_socket().tos()
2032 }
2033
2034 /// Sets the value for the `IP_TOS` option on this socket.
2035 ///
2036 /// This value sets the type-of-service field that is used in every packet
2037 /// sent from this socket.
2038 ///
2039 /// **NOTE:** On Windows, `IP_TOS` is only supported on [Windows 8+ or
2040 /// Windows Server 2012+.](https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options)
2041 // https://docs.rs/socket2/0.5.3/src/socket2/socket.rs.html#1446
2042 #[cfg(not(any(
2043 target_os = "fuchsia",
2044 target_os = "redox",
2045 target_os = "solaris",
2046 target_os = "illumos",
2047 target_os = "haiku"
2048 )))]
2049 #[cfg_attr(
2050 docsrs,
2051 doc(cfg(not(any(
2052 target_os = "fuchsia",
2053 target_os = "redox",
2054 target_os = "solaris",
2055 target_os = "illumos",
2056 target_os = "haiku"
2057 ))))
2058 )]
2059 pub fn set_tos(&self, tos: u32) -> io::Result<()> {
2060 self.as_socket().set_tos(tos)
2061 }
2062
2063 /// Gets the value for the `SO_BINDTODEVICE` option on this socket
2064 ///
2065 /// This value gets the socket-bound device's interface name.
2066 #[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux",))]
2067 #[cfg_attr(
2068 docsrs,
2069 doc(cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux",)))
2070 )]
2071 pub fn device(&self) -> io::Result<Option<Vec<u8>>> {
2072 self.as_socket().device()
2073 }
2074
2075 /// Sets the value for the `SO_BINDTODEVICE` option on this socket
2076 ///
2077 /// If a socket is bound to an interface, only packets received from that
2078 /// particular interface are processed by the socket. Note that this only
2079 /// works for some socket types, particularly `AF_INET` sockets.
2080 ///
2081 /// If `interface` is `None` or an empty string it removes the binding.
2082 #[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))]
2083 #[cfg_attr(
2084 docsrs,
2085 doc(cfg(all(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))))
2086 )]
2087 pub fn bind_device(&self, interface: Option<&[u8]>) -> io::Result<()> {
2088 self.as_socket().bind_device(interface)
2089 }
2090
2091 /// Executes an operation of the `IP_ADD_MEMBERSHIP` type.
2092 ///
2093 /// This function specifies a new multicast group for this socket to join.
2094 /// The address must be a valid multicast address, and `interface` is the
2095 /// address of the local interface with which the system should join the
2096 /// multicast group. If it's equal to `INADDR_ANY` then an appropriate
2097 /// interface is chosen by the system.
2098 pub fn join_multicast_v4(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr) -> io::Result<()> {
2099 self.io.join_multicast_v4(&multiaddr, &interface)
2100 }
2101
2102 /// Executes an operation of the `IPV6_ADD_MEMBERSHIP` type.
2103 ///
2104 /// This function specifies a new multicast group for this socket to join.
2105 /// The address must be a valid multicast address, and `interface` is the
2106 /// index of the interface to join/leave (or 0 to indicate any interface).
2107 pub fn join_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> {
2108 self.io.join_multicast_v6(multiaddr, interface)
2109 }
2110
2111 /// Executes an operation of the `IP_DROP_MEMBERSHIP` type.
2112 ///
2113 /// For more information about this option, see [`join_multicast_v4`].
2114 ///
2115 /// [`join_multicast_v4`]: method@Self::join_multicast_v4
2116 pub fn leave_multicast_v4(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr) -> io::Result<()> {
2117 self.io.leave_multicast_v4(&multiaddr, &interface)
2118 }
2119
2120 /// Executes an operation of the `IPV6_DROP_MEMBERSHIP` type.
2121 ///
2122 /// For more information about this option, see [`join_multicast_v6`].
2123 ///
2124 /// [`join_multicast_v6`]: method@Self::join_multicast_v6
2125 pub fn leave_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> {
2126 self.io.leave_multicast_v6(multiaddr, interface)
2127 }
2128
2129 /// Returns the value of the `SO_ERROR` option.
2130 ///
2131 /// # Examples
2132 /// ```
2133 /// # if cfg!(miri) { return } // No `socket` in miri.
2134 /// use tokio::net::UdpSocket;
2135 /// use std::io;
2136 ///
2137 /// #[tokio::main]
2138 /// async fn main() -> io::Result<()> {
2139 /// // Create a socket
2140 /// let socket = UdpSocket::bind("0.0.0.0:8080").await?;
2141 ///
2142 /// if let Ok(Some(err)) = socket.take_error() {
2143 /// println!("Got error: {:?}", err);
2144 /// }
2145 ///
2146 /// Ok(())
2147 /// }
2148 /// ```
2149 pub fn take_error(&self) -> io::Result<Option<io::Error>> {
2150 self.io.take_error()
2151 }
2152}
2153
2154impl TryFrom<std::net::UdpSocket> for UdpSocket {
2155 type Error = io::Error;
2156
2157 /// Consumes stream, returning the tokio I/O object.
2158 ///
2159 /// This is equivalent to
2160 /// [`UdpSocket::from_std(stream)`](UdpSocket::from_std).
2161 fn try_from(stream: std::net::UdpSocket) -> Result<Self, Self::Error> {
2162 Self::from_std(stream)
2163 }
2164}
2165
2166impl fmt::Debug for UdpSocket {
2167 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2168 self.io.fmt(f)
2169 }
2170}
2171
2172#[cfg(unix)]
2173mod sys {
2174 use super::UdpSocket;
2175 use std::os::unix::prelude::*;
2176
2177 impl AsRawFd for UdpSocket {
2178 fn as_raw_fd(&self) -> RawFd {
2179 self.io.as_raw_fd()
2180 }
2181 }
2182
2183 impl AsFd for UdpSocket {
2184 fn as_fd(&self) -> BorrowedFd<'_> {
2185 unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) }
2186 }
2187 }
2188}
2189
2190cfg_windows! {
2191 use crate::os::windows::io::{AsRawSocket, RawSocket};
2192 use crate::os::windows::io::{AsSocket, BorrowedSocket};
2193
2194 impl AsRawSocket for UdpSocket {
2195 fn as_raw_socket(&self) -> RawSocket {
2196 self.io.as_raw_socket()
2197 }
2198 }
2199
2200 impl AsSocket for UdpSocket {
2201 fn as_socket(&self) -> BorrowedSocket<'_> {
2202 unsafe { BorrowedSocket::borrow_raw(self.as_raw_socket()) }
2203 }
2204 }
2205}