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