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::{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(|io| io.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 let n = ready!(self.io.registration().poll_read_io(cx, || { 808 // Safety: will not read the maybe uninitialized bytes. 809 let b = unsafe { 810 &mut *(buf.unfilled_mut() as *mut [std::mem::MaybeUninit<u8>] as *mut [u8]) 811 }; 812 813 self.io.recv(b) 814 }))?; 815 816 // Safety: We trust `recv` to have filled up `n` bytes in the buffer. 817 unsafe { 818 buf.assume_init(n); 819 } 820 buf.advance(n); 821 Poll::Ready(Ok(())) 822 } 823 824 /// Tries to receive a single datagram message on the socket from the remote 825 /// address to which it is connected. On success, returns the number of 826 /// bytes read. 827 /// 828 /// This method must be called with valid byte array buf of sufficient size 829 /// to hold the message bytes. If a message is too long to fit in the 830 /// supplied buffer, excess bytes may be discarded. 831 /// 832 /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is 833 /// returned. This function is usually paired with `readable()`. 834 /// 835 /// # Examples 836 /// 837 /// ```no_run 838 /// use tokio::net::UdpSocket; 839 /// use std::io; 840 /// 841 /// #[tokio::main] 842 /// async fn main() -> io::Result<()> { 843 /// // Connect to a peer 844 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?; 845 /// socket.connect("127.0.0.1:8081").await?; 846 /// 847 /// loop { 848 /// // Wait for the socket to be readable 849 /// socket.readable().await?; 850 /// 851 /// // The buffer is **not** included in the async task and will 852 /// // only exist on the stack. 853 /// let mut buf = [0; 1024]; 854 /// 855 /// // Try to recv data, this may still fail with `WouldBlock` 856 /// // if the readiness event is a false positive. 857 /// match socket.try_recv(&mut buf) { 858 /// Ok(n) => { 859 /// println!("GOT {:?}", &buf[..n]); 860 /// break; 861 /// } 862 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { 863 /// continue; 864 /// } 865 /// Err(e) => { 866 /// return Err(e); 867 /// } 868 /// } 869 /// } 870 /// 871 /// Ok(()) 872 /// } 873 /// ``` try_recv(&self, buf: &mut [u8]) -> io::Result<usize>874 pub fn try_recv(&self, buf: &mut [u8]) -> io::Result<usize> { 875 self.io 876 .registration() 877 .try_io(Interest::READABLE, || self.io.recv(buf)) 878 } 879 880 cfg_io_util! { 881 /// Tries to receive data from the stream into the provided buffer, advancing the 882 /// buffer's internal cursor, returning how many bytes were read. 883 /// 884 /// This method must be called with valid byte array buf of sufficient size 885 /// to hold the message bytes. If a message is too long to fit in the 886 /// supplied buffer, excess bytes may be discarded. 887 /// 888 /// This method can be used even if `buf` is uninitialized. 889 /// 890 /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is 891 /// returned. This function is usually paired with `readable()`. 892 /// 893 /// # Examples 894 /// 895 /// ```no_run 896 /// use tokio::net::UdpSocket; 897 /// use std::io; 898 /// 899 /// #[tokio::main] 900 /// async fn main() -> io::Result<()> { 901 /// // Connect to a peer 902 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?; 903 /// socket.connect("127.0.0.1:8081").await?; 904 /// 905 /// loop { 906 /// // Wait for the socket to be readable 907 /// socket.readable().await?; 908 /// 909 /// let mut buf = Vec::with_capacity(1024); 910 /// 911 /// // Try to recv data, this may still fail with `WouldBlock` 912 /// // if the readiness event is a false positive. 913 /// match socket.try_recv_buf(&mut buf) { 914 /// Ok(n) => { 915 /// println!("GOT {:?}", &buf[..n]); 916 /// break; 917 /// } 918 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { 919 /// continue; 920 /// } 921 /// Err(e) => { 922 /// return Err(e); 923 /// } 924 /// } 925 /// } 926 /// 927 /// Ok(()) 928 /// } 929 /// ``` 930 pub fn try_recv_buf<B: BufMut>(&self, buf: &mut B) -> io::Result<usize> { 931 self.io.registration().try_io(Interest::READABLE, || { 932 let dst = buf.chunk_mut(); 933 let dst = 934 unsafe { &mut *(dst as *mut _ as *mut [std::mem::MaybeUninit<u8>] as *mut [u8]) }; 935 936 let n = (*self.io).recv(dst)?; 937 938 // Safety: We trust `UdpSocket::recv` to have filled up `n` bytes in the 939 // buffer. 940 unsafe { 941 buf.advance_mut(n); 942 } 943 944 Ok(n) 945 }) 946 } 947 948 /// Receives a single datagram message on the socket from the remote address 949 /// to which it is connected, advancing the buffer's internal cursor, 950 /// returning how many bytes were read. 951 /// 952 /// This method must be called with valid byte array buf of sufficient size 953 /// to hold the message bytes. If a message is too long to fit in the 954 /// supplied buffer, excess bytes may be discarded. 955 /// 956 /// This method can be used even if `buf` is uninitialized. 957 /// 958 /// # Examples 959 /// 960 /// ```no_run 961 /// use tokio::net::UdpSocket; 962 /// use std::io; 963 /// 964 /// #[tokio::main] 965 /// async fn main() -> io::Result<()> { 966 /// // Connect to a peer 967 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?; 968 /// socket.connect("127.0.0.1:8081").await?; 969 /// 970 /// let mut buf = Vec::with_capacity(512); 971 /// let len = socket.recv_buf(&mut buf).await?; 972 /// 973 /// println!("received {} bytes {:?}", len, &buf[..len]); 974 /// 975 /// Ok(()) 976 /// } 977 /// ``` 978 pub async fn recv_buf<B: BufMut>(&self, buf: &mut B) -> io::Result<usize> { 979 self.io.registration().async_io(Interest::READABLE, || { 980 let dst = buf.chunk_mut(); 981 let dst = 982 unsafe { &mut *(dst as *mut _ as *mut [std::mem::MaybeUninit<u8>] as *mut [u8]) }; 983 984 let n = (*self.io).recv(dst)?; 985 986 // Safety: We trust `UdpSocket::recv` to have filled up `n` bytes in the 987 // buffer. 988 unsafe { 989 buf.advance_mut(n); 990 } 991 992 Ok(n) 993 }).await 994 } 995 996 /// Tries to receive a single datagram message on the socket. On success, 997 /// returns the number of bytes read and the origin. 998 /// 999 /// This method must be called with valid byte array buf of sufficient size 1000 /// to hold the message bytes. If a message is too long to fit in the 1001 /// supplied buffer, excess bytes may be discarded. 1002 /// 1003 /// This method can be used even if `buf` is uninitialized. 1004 /// 1005 /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is 1006 /// returned. This function is usually paired with `readable()`. 1007 /// 1008 /// # Notes 1009 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively 1010 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack]. 1011 /// Because UDP is stateless and does not validate the origin of a packet, 1012 /// the attacker does not need to be able to intercept traffic in order to interfere. 1013 /// It is important to be aware of this when designing your application-level protocol. 1014 /// 1015 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection 1016 /// 1017 /// # Examples 1018 /// 1019 /// ```no_run 1020 /// use tokio::net::UdpSocket; 1021 /// use std::io; 1022 /// 1023 /// #[tokio::main] 1024 /// async fn main() -> io::Result<()> { 1025 /// // Connect to a peer 1026 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?; 1027 /// 1028 /// loop { 1029 /// // Wait for the socket to be readable 1030 /// socket.readable().await?; 1031 /// 1032 /// let mut buf = Vec::with_capacity(1024); 1033 /// 1034 /// // Try to recv data, this may still fail with `WouldBlock` 1035 /// // if the readiness event is a false positive. 1036 /// match socket.try_recv_buf_from(&mut buf) { 1037 /// Ok((n, _addr)) => { 1038 /// println!("GOT {:?}", &buf[..n]); 1039 /// break; 1040 /// } 1041 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { 1042 /// continue; 1043 /// } 1044 /// Err(e) => { 1045 /// return Err(e); 1046 /// } 1047 /// } 1048 /// } 1049 /// 1050 /// Ok(()) 1051 /// } 1052 /// ``` 1053 pub fn try_recv_buf_from<B: BufMut>(&self, buf: &mut B) -> io::Result<(usize, SocketAddr)> { 1054 self.io.registration().try_io(Interest::READABLE, || { 1055 let dst = buf.chunk_mut(); 1056 let dst = 1057 unsafe { &mut *(dst as *mut _ as *mut [std::mem::MaybeUninit<u8>] as *mut [u8]) }; 1058 1059 let (n, addr) = (*self.io).recv_from(dst)?; 1060 1061 // Safety: We trust `UdpSocket::recv_from` to have filled up `n` bytes in the 1062 // buffer. 1063 unsafe { 1064 buf.advance_mut(n); 1065 } 1066 1067 Ok((n, addr)) 1068 }) 1069 } 1070 1071 /// Receives a single datagram message on the socket, advancing the 1072 /// buffer's internal cursor, returning how many bytes were read and the origin. 1073 /// 1074 /// This method must be called with valid byte array buf of sufficient size 1075 /// to hold the message bytes. If a message is too long to fit in the 1076 /// supplied buffer, excess bytes may be discarded. 1077 /// 1078 /// This method can be used even if `buf` is uninitialized. 1079 /// 1080 /// # Notes 1081 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively 1082 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack]. 1083 /// Because UDP is stateless and does not validate the origin of a packet, 1084 /// the attacker does not need to be able to intercept traffic in order to interfere. 1085 /// It is important to be aware of this when designing your application-level protocol. 1086 /// 1087 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection 1088 /// 1089 /// # Examples 1090 /// 1091 /// ```no_run 1092 /// use tokio::net::UdpSocket; 1093 /// use std::io; 1094 /// 1095 /// #[tokio::main] 1096 /// async fn main() -> io::Result<()> { 1097 /// // Connect to a peer 1098 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?; 1099 /// socket.connect("127.0.0.1:8081").await?; 1100 /// 1101 /// let mut buf = Vec::with_capacity(512); 1102 /// let (len, addr) = socket.recv_buf_from(&mut buf).await?; 1103 /// 1104 /// println!("received {:?} bytes from {:?}", len, addr); 1105 /// 1106 /// Ok(()) 1107 /// } 1108 /// ``` 1109 pub async fn recv_buf_from<B: BufMut>(&self, buf: &mut B) -> io::Result<(usize, SocketAddr)> { 1110 self.io.registration().async_io(Interest::READABLE, || { 1111 let dst = buf.chunk_mut(); 1112 let dst = 1113 unsafe { &mut *(dst as *mut _ as *mut [std::mem::MaybeUninit<u8>] as *mut [u8]) }; 1114 1115 let (n, addr) = (*self.io).recv_from(dst)?; 1116 1117 // Safety: We trust `UdpSocket::recv_from` to have filled up `n` bytes in the 1118 // buffer. 1119 unsafe { 1120 buf.advance_mut(n); 1121 } 1122 1123 Ok((n,addr)) 1124 }).await 1125 } 1126 } 1127 1128 /// Sends data on the socket to the given address. On success, returns the 1129 /// number of bytes written. 1130 /// 1131 /// Address type can be any implementor of [`ToSocketAddrs`] trait. See its 1132 /// documentation for concrete examples. 1133 /// 1134 /// It is possible for `addr` to yield multiple addresses, but `send_to` 1135 /// will only send data to the first address yielded by `addr`. 1136 /// 1137 /// This will return an error when the IP version of the local socket does 1138 /// not match that returned from [`ToSocketAddrs`]. 1139 /// 1140 /// [`ToSocketAddrs`]: crate::net::ToSocketAddrs 1141 /// 1142 /// # Cancel safety 1143 /// 1144 /// This method is cancel safe. If `send_to` is used as the event in a 1145 /// [`tokio::select!`](crate::select) statement and some other branch 1146 /// completes first, then it is guaranteed that the message was not sent. 1147 /// 1148 /// # Example 1149 /// 1150 /// ```no_run 1151 /// use tokio::net::UdpSocket; 1152 /// use std::io; 1153 /// 1154 /// #[tokio::main] 1155 /// async fn main() -> io::Result<()> { 1156 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?; 1157 /// let len = socket.send_to(b"hello world", "127.0.0.1:8081").await?; 1158 /// 1159 /// println!("Sent {} bytes", len); 1160 /// 1161 /// Ok(()) 1162 /// } 1163 /// ``` send_to<A: ToSocketAddrs>(&self, buf: &[u8], target: A) -> io::Result<usize>1164 pub async fn send_to<A: ToSocketAddrs>(&self, buf: &[u8], target: A) -> io::Result<usize> { 1165 let mut addrs = to_socket_addrs(target).await?; 1166 1167 match addrs.next() { 1168 Some(target) => self.send_to_addr(buf, target).await, 1169 None => Err(io::Error::new( 1170 io::ErrorKind::InvalidInput, 1171 "no addresses to send data to", 1172 )), 1173 } 1174 } 1175 1176 /// Attempts to send data on the socket to a given address. 1177 /// 1178 /// Note that on multiple calls to a `poll_*` method in the send direction, only the 1179 /// `Waker` from the `Context` passed to the most recent call will be scheduled to 1180 /// receive a wakeup. 1181 /// 1182 /// # Return value 1183 /// 1184 /// The function returns: 1185 /// 1186 /// * `Poll::Pending` if the socket is not ready to write 1187 /// * `Poll::Ready(Ok(n))` `n` is the number of bytes sent. 1188 /// * `Poll::Ready(Err(e))` if an error is encountered. 1189 /// 1190 /// # Errors 1191 /// 1192 /// 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>>1193 pub fn poll_send_to( 1194 &self, 1195 cx: &mut Context<'_>, 1196 buf: &[u8], 1197 target: SocketAddr, 1198 ) -> Poll<io::Result<usize>> { 1199 self.io 1200 .registration() 1201 .poll_write_io(cx, || self.io.send_to(buf, target)) 1202 } 1203 1204 /// Tries to send data on the socket to the given address, but if the send is 1205 /// blocked this will return right away. 1206 /// 1207 /// This function is usually paired with `writable()`. 1208 /// 1209 /// # Returns 1210 /// 1211 /// If successful, returns the number of bytes sent 1212 /// 1213 /// Users should ensure that when the remote cannot receive, the 1214 /// [`ErrorKind::WouldBlock`] is properly handled. An error can also occur 1215 /// if the IP version of the socket does not match that of `target`. 1216 /// 1217 /// [`ErrorKind::WouldBlock`]: std::io::ErrorKind::WouldBlock 1218 /// 1219 /// # Example 1220 /// 1221 /// ```no_run 1222 /// use tokio::net::UdpSocket; 1223 /// use std::error::Error; 1224 /// use std::io; 1225 /// 1226 /// #[tokio::main] 1227 /// async fn main() -> Result<(), Box<dyn Error>> { 1228 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?; 1229 /// 1230 /// let dst = "127.0.0.1:8081".parse()?; 1231 /// 1232 /// loop { 1233 /// socket.writable().await?; 1234 /// 1235 /// match socket.try_send_to(&b"hello world"[..], dst) { 1236 /// Ok(sent) => { 1237 /// println!("sent {} bytes", sent); 1238 /// break; 1239 /// } 1240 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { 1241 /// // Writable false positive. 1242 /// continue; 1243 /// } 1244 /// Err(e) => return Err(e.into()), 1245 /// } 1246 /// } 1247 /// 1248 /// Ok(()) 1249 /// } 1250 /// ``` try_send_to(&self, buf: &[u8], target: SocketAddr) -> io::Result<usize>1251 pub fn try_send_to(&self, buf: &[u8], target: SocketAddr) -> io::Result<usize> { 1252 self.io 1253 .registration() 1254 .try_io(Interest::WRITABLE, || self.io.send_to(buf, target)) 1255 } 1256 send_to_addr(&self, buf: &[u8], target: SocketAddr) -> io::Result<usize>1257 async fn send_to_addr(&self, buf: &[u8], target: SocketAddr) -> io::Result<usize> { 1258 self.io 1259 .registration() 1260 .async_io(Interest::WRITABLE, || self.io.send_to(buf, target)) 1261 .await 1262 } 1263 1264 /// Receives a single datagram message on the socket. On success, returns 1265 /// the number of bytes read and the origin. 1266 /// 1267 /// The function must be called with valid byte array `buf` of sufficient 1268 /// size to hold the message bytes. If a message is too long to fit in the 1269 /// supplied buffer, excess bytes may be discarded. 1270 /// 1271 /// # Cancel safety 1272 /// 1273 /// This method is cancel safe. If `recv_from` is used as the event in a 1274 /// [`tokio::select!`](crate::select) statement and some other branch 1275 /// completes first, it is guaranteed that no messages were received on this 1276 /// socket. 1277 /// 1278 /// # Example 1279 /// 1280 /// ```no_run 1281 /// use tokio::net::UdpSocket; 1282 /// use std::io; 1283 /// 1284 /// #[tokio::main] 1285 /// async fn main() -> io::Result<()> { 1286 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?; 1287 /// 1288 /// let mut buf = vec![0u8; 32]; 1289 /// let (len, addr) = socket.recv_from(&mut buf).await?; 1290 /// 1291 /// println!("received {:?} bytes from {:?}", len, addr); 1292 /// 1293 /// Ok(()) 1294 /// } 1295 /// ``` 1296 /// 1297 /// # Notes 1298 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively 1299 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack]. 1300 /// Because UDP is stateless and does not validate the origin of a packet, 1301 /// the attacker does not need to be able to intercept traffic in order to interfere. 1302 /// It is important to be aware of this when designing your application-level protocol. 1303 /// 1304 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)>1305 pub async fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> { 1306 self.io 1307 .registration() 1308 .async_io(Interest::READABLE, || self.io.recv_from(buf)) 1309 .await 1310 } 1311 1312 /// Attempts to receive a single datagram on the socket. 1313 /// 1314 /// Note that on multiple calls to a `poll_*` method in the recv direction, only the 1315 /// `Waker` from the `Context` passed to the most recent call will be scheduled to 1316 /// receive a wakeup. 1317 /// 1318 /// # Return value 1319 /// 1320 /// The function returns: 1321 /// 1322 /// * `Poll::Pending` if the socket is not ready to read 1323 /// * `Poll::Ready(Ok(addr))` reads data from `addr` into `ReadBuf` if the socket is ready 1324 /// * `Poll::Ready(Err(e))` if an error is encountered. 1325 /// 1326 /// # Errors 1327 /// 1328 /// This function may encounter any standard I/O error except `WouldBlock`. 1329 /// 1330 /// # Notes 1331 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively 1332 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack]. 1333 /// Because UDP is stateless and does not validate the origin of a packet, 1334 /// the attacker does not need to be able to intercept traffic in order to interfere. 1335 /// It is important to be aware of this when designing your application-level protocol. 1336 /// 1337 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection poll_recv_from( &self, cx: &mut Context<'_>, buf: &mut ReadBuf<'_>, ) -> Poll<io::Result<SocketAddr>>1338 pub fn poll_recv_from( 1339 &self, 1340 cx: &mut Context<'_>, 1341 buf: &mut ReadBuf<'_>, 1342 ) -> Poll<io::Result<SocketAddr>> { 1343 let (n, addr) = ready!(self.io.registration().poll_read_io(cx, || { 1344 // Safety: will not read the maybe uninitialized bytes. 1345 let b = unsafe { 1346 &mut *(buf.unfilled_mut() as *mut [std::mem::MaybeUninit<u8>] as *mut [u8]) 1347 }; 1348 1349 self.io.recv_from(b) 1350 }))?; 1351 1352 // Safety: We trust `recv` to have filled up `n` bytes in the buffer. 1353 unsafe { 1354 buf.assume_init(n); 1355 } 1356 buf.advance(n); 1357 Poll::Ready(Ok(addr)) 1358 } 1359 1360 /// Tries to receive a single datagram message on the socket. On success, 1361 /// returns the number of bytes read and the origin. 1362 /// 1363 /// This method must be called with valid byte array buf of sufficient size 1364 /// to hold the message bytes. If a message is too long to fit in the 1365 /// supplied buffer, excess bytes may be discarded. 1366 /// 1367 /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is 1368 /// returned. This function is usually paired with `readable()`. 1369 /// 1370 /// # Notes 1371 /// 1372 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively 1373 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack]. 1374 /// Because UDP is stateless and does not validate the origin of a packet, 1375 /// the attacker does not need to be able to intercept traffic in order to interfere. 1376 /// It is important to be aware of this when designing your application-level protocol. 1377 /// 1378 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection 1379 /// 1380 /// # Examples 1381 /// 1382 /// ```no_run 1383 /// use tokio::net::UdpSocket; 1384 /// use std::io; 1385 /// 1386 /// #[tokio::main] 1387 /// async fn main() -> io::Result<()> { 1388 /// // Connect to a peer 1389 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?; 1390 /// 1391 /// loop { 1392 /// // Wait for the socket to be readable 1393 /// socket.readable().await?; 1394 /// 1395 /// // The buffer is **not** included in the async task and will 1396 /// // only exist on the stack. 1397 /// let mut buf = [0; 1024]; 1398 /// 1399 /// // Try to recv data, this may still fail with `WouldBlock` 1400 /// // if the readiness event is a false positive. 1401 /// match socket.try_recv_from(&mut buf) { 1402 /// Ok((n, _addr)) => { 1403 /// println!("GOT {:?}", &buf[..n]); 1404 /// break; 1405 /// } 1406 /// Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { 1407 /// continue; 1408 /// } 1409 /// Err(e) => { 1410 /// return Err(e); 1411 /// } 1412 /// } 1413 /// } 1414 /// 1415 /// Ok(()) 1416 /// } 1417 /// ``` try_recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)>1418 pub fn try_recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> { 1419 self.io 1420 .registration() 1421 .try_io(Interest::READABLE, || self.io.recv_from(buf)) 1422 } 1423 1424 /// Tries to read or write from the socket using a user-provided IO operation. 1425 /// 1426 /// If the socket is ready, the provided closure is called. The closure 1427 /// should attempt to perform IO operation on the socket by manually 1428 /// calling the appropriate syscall. If the operation fails because the 1429 /// socket is not actually ready, then the closure should return a 1430 /// `WouldBlock` error and the readiness flag is cleared. The return value 1431 /// of the closure is then returned by `try_io`. 1432 /// 1433 /// If the socket is not ready, then the closure is not called 1434 /// and a `WouldBlock` error is returned. 1435 /// 1436 /// The closure should only return a `WouldBlock` error if it has performed 1437 /// an IO operation on the socket that failed due to the socket not being 1438 /// ready. Returning a `WouldBlock` error in any other situation will 1439 /// incorrectly clear the readiness flag, which can cause the socket to 1440 /// behave incorrectly. 1441 /// 1442 /// The closure should not perform the IO operation using any of the methods 1443 /// defined on the Tokio `UdpSocket` type, as this will mess with the 1444 /// readiness flag and can cause the socket to behave incorrectly. 1445 /// 1446 /// This method is not intended to be used with combined interests. 1447 /// The closure should perform only one type of IO operation, so it should not 1448 /// require more than one ready state. This method may panic or sleep forever 1449 /// if it is called with a combined interest. 1450 /// 1451 /// Usually, [`readable()`], [`writable()`] or [`ready()`] is used with this function. 1452 /// 1453 /// [`readable()`]: UdpSocket::readable() 1454 /// [`writable()`]: UdpSocket::writable() 1455 /// [`ready()`]: UdpSocket::ready() try_io<R>( &self, interest: Interest, f: impl FnOnce() -> io::Result<R>, ) -> io::Result<R>1456 pub fn try_io<R>( 1457 &self, 1458 interest: Interest, 1459 f: impl FnOnce() -> io::Result<R>, 1460 ) -> io::Result<R> { 1461 self.io 1462 .registration() 1463 .try_io(interest, || self.io.try_io(f)) 1464 } 1465 1466 /// Reads or writes from the socket using a user-provided IO operation. 1467 /// 1468 /// The readiness of the socket is awaited and when the socket is ready, 1469 /// the provided closure is called. The closure should attempt to perform 1470 /// IO operation on the socket by manually calling the appropriate syscall. 1471 /// If the operation fails because the socket is not actually ready, 1472 /// then the closure should return a `WouldBlock` error. In such case the 1473 /// readiness flag is cleared and the socket readiness is awaited again. 1474 /// This loop is repeated until the closure returns an `Ok` or an error 1475 /// other than `WouldBlock`. 1476 /// 1477 /// The closure should only return a `WouldBlock` error if it has performed 1478 /// an IO operation on the socket that failed due to the socket not being 1479 /// ready. Returning a `WouldBlock` error in any other situation will 1480 /// incorrectly clear the readiness flag, which can cause the socket to 1481 /// behave incorrectly. 1482 /// 1483 /// The closure should not perform the IO operation using any of the methods 1484 /// defined on the Tokio `UdpSocket` type, as this will mess with the 1485 /// readiness flag and can cause the socket to behave incorrectly. 1486 /// 1487 /// This method is not intended to be used with combined interests. 1488 /// The closure should perform only one type of IO operation, so it should not 1489 /// require more than one ready state. This method may panic or sleep forever 1490 /// if it is called with a combined interest. async_io<R>( &self, interest: Interest, mut f: impl FnMut() -> io::Result<R>, ) -> io::Result<R>1491 pub async fn async_io<R>( 1492 &self, 1493 interest: Interest, 1494 mut f: impl FnMut() -> io::Result<R>, 1495 ) -> io::Result<R> { 1496 self.io 1497 .registration() 1498 .async_io(interest, || self.io.try_io(&mut f)) 1499 .await 1500 } 1501 1502 /// Receives data from the socket, without removing it from the input queue. 1503 /// On success, returns the number of bytes read and the address from whence 1504 /// the data came. 1505 /// 1506 /// # Notes 1507 /// 1508 /// On Windows, if the data is larger than the buffer specified, the buffer 1509 /// is filled with the first part of the data, and peek_from returns the error 1510 /// WSAEMSGSIZE(10040). The excess data is lost. 1511 /// Make sure to always use a sufficiently large buffer to hold the 1512 /// maximum UDP packet size, which can be up to 65536 bytes in size. 1513 /// 1514 /// MacOS will return an error if you pass a zero-sized buffer. 1515 /// 1516 /// If you're merely interested in learning the sender of the data at the head of the queue, 1517 /// try [`peek_sender`]. 1518 /// 1519 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively 1520 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack]. 1521 /// Because UDP is stateless and does not validate the origin of a packet, 1522 /// the attacker does not need to be able to intercept traffic in order to interfere. 1523 /// It is important to be aware of this when designing your application-level protocol. 1524 /// 1525 /// # Examples 1526 /// 1527 /// ```no_run 1528 /// use tokio::net::UdpSocket; 1529 /// use std::io; 1530 /// 1531 /// #[tokio::main] 1532 /// async fn main() -> io::Result<()> { 1533 /// let socket = UdpSocket::bind("127.0.0.1:8080").await?; 1534 /// 1535 /// let mut buf = vec![0u8; 32]; 1536 /// let (len, addr) = socket.peek_from(&mut buf).await?; 1537 /// 1538 /// println!("peeked {:?} bytes from {:?}", len, addr); 1539 /// 1540 /// Ok(()) 1541 /// } 1542 /// ``` 1543 /// 1544 /// [`peek_sender`]: method@Self::peek_sender 1545 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection peek_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)>1546 pub async fn peek_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> { 1547 self.io 1548 .registration() 1549 .async_io(Interest::READABLE, || self.io.peek_from(buf)) 1550 .await 1551 } 1552 1553 /// Receives data from the socket, without removing it from the input queue. 1554 /// On success, returns the sending address of the datagram. 1555 /// 1556 /// # Notes 1557 /// 1558 /// Note that on multiple calls to a `poll_*` method in the recv direction, only the 1559 /// `Waker` from the `Context` passed to the most recent call will be scheduled to 1560 /// receive a wakeup 1561 /// 1562 /// On Windows, if the data is larger than the buffer specified, the buffer 1563 /// is filled with the first part of the data, and peek returns the error 1564 /// WSAEMSGSIZE(10040). The excess data is lost. 1565 /// Make sure to always use a sufficiently large buffer to hold the 1566 /// maximum UDP packet size, which can be up to 65536 bytes in size. 1567 /// 1568 /// MacOS will return an error if you pass a zero-sized buffer. 1569 /// 1570 /// If you're merely interested in learning the sender of the data at the head of the queue, 1571 /// try [`poll_peek_sender`]. 1572 /// 1573 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively 1574 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack]. 1575 /// Because UDP is stateless and does not validate the origin of a packet, 1576 /// the attacker does not need to be able to intercept traffic in order to interfere. 1577 /// It is important to be aware of this when designing your application-level protocol. 1578 /// 1579 /// # Return value 1580 /// 1581 /// The function returns: 1582 /// 1583 /// * `Poll::Pending` if the socket is not ready to read 1584 /// * `Poll::Ready(Ok(addr))` reads data from `addr` into `ReadBuf` if the socket is ready 1585 /// * `Poll::Ready(Err(e))` if an error is encountered. 1586 /// 1587 /// # Errors 1588 /// 1589 /// This function may encounter any standard I/O error except `WouldBlock`. 1590 /// 1591 /// [`poll_peek_sender`]: method@Self::poll_peek_sender 1592 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection poll_peek_from( &self, cx: &mut Context<'_>, buf: &mut ReadBuf<'_>, ) -> Poll<io::Result<SocketAddr>>1593 pub fn poll_peek_from( 1594 &self, 1595 cx: &mut Context<'_>, 1596 buf: &mut ReadBuf<'_>, 1597 ) -> Poll<io::Result<SocketAddr>> { 1598 let (n, addr) = ready!(self.io.registration().poll_read_io(cx, || { 1599 // Safety: will not read the maybe uninitialized bytes. 1600 let b = unsafe { 1601 &mut *(buf.unfilled_mut() as *mut [std::mem::MaybeUninit<u8>] as *mut [u8]) 1602 }; 1603 1604 self.io.peek_from(b) 1605 }))?; 1606 1607 // Safety: We trust `recv` to have filled up `n` bytes in the buffer. 1608 unsafe { 1609 buf.assume_init(n); 1610 } 1611 buf.advance(n); 1612 Poll::Ready(Ok(addr)) 1613 } 1614 1615 /// Tries to receive data on the socket without removing it from the input queue. 1616 /// On success, returns the number of bytes read and the sending address of the 1617 /// datagram. 1618 /// 1619 /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is 1620 /// returned. This function is usually paired with `readable()`. 1621 /// 1622 /// # Notes 1623 /// 1624 /// On Windows, if the data is larger than the buffer specified, the buffer 1625 /// is filled with the first part of the data, and peek returns the error 1626 /// WSAEMSGSIZE(10040). The excess data is lost. 1627 /// Make sure to always use a sufficiently large buffer to hold the 1628 /// maximum UDP packet size, which can be up to 65536 bytes in size. 1629 /// 1630 /// MacOS will return an error if you pass a zero-sized buffer. 1631 /// 1632 /// If you're merely interested in learning the sender of the data at the head of the queue, 1633 /// try [`try_peek_sender`]. 1634 /// 1635 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively 1636 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack]. 1637 /// Because UDP is stateless and does not validate the origin of a packet, 1638 /// the attacker does not need to be able to intercept traffic in order to interfere. 1639 /// It is important to be aware of this when designing your application-level protocol. 1640 /// 1641 /// [`try_peek_sender`]: method@Self::try_peek_sender 1642 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection try_peek_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)>1643 pub fn try_peek_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> { 1644 self.io 1645 .registration() 1646 .try_io(Interest::READABLE, || self.io.peek_from(buf)) 1647 } 1648 1649 /// Retrieve the sender of the data at the head of the input queue, waiting if empty. 1650 /// 1651 /// This is equivalent to calling [`peek_from`] with a zero-sized buffer, 1652 /// but suppresses the `WSAEMSGSIZE` error on Windows and the "invalid argument" error on macOS. 1653 /// 1654 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively 1655 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack]. 1656 /// Because UDP is stateless and does not validate the origin of a packet, 1657 /// the attacker does not need to be able to intercept traffic in order to interfere. 1658 /// It is important to be aware of this when designing your application-level protocol. 1659 /// 1660 /// [`peek_from`]: method@Self::peek_from 1661 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection peek_sender(&self) -> io::Result<SocketAddr>1662 pub async fn peek_sender(&self) -> io::Result<SocketAddr> { 1663 self.io 1664 .registration() 1665 .async_io(Interest::READABLE, || self.peek_sender_inner()) 1666 .await 1667 } 1668 1669 /// Retrieve the sender of the data at the head of the input queue, 1670 /// scheduling a wakeup if empty. 1671 /// 1672 /// This is equivalent to calling [`poll_peek_from`] with a zero-sized buffer, 1673 /// but suppresses the `WSAEMSGSIZE` error on Windows and the "invalid argument" error on macOS. 1674 /// 1675 /// # Notes 1676 /// 1677 /// Note that on multiple calls to a `poll_*` method in the recv direction, only the 1678 /// `Waker` from the `Context` passed to the most recent call will be scheduled to 1679 /// receive a wakeup. 1680 /// 1681 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively 1682 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack]. 1683 /// Because UDP is stateless and does not validate the origin of a packet, 1684 /// the attacker does not need to be able to intercept traffic in order to interfere. 1685 /// It is important to be aware of this when designing your application-level protocol. 1686 /// 1687 /// [`poll_peek_from`]: method@Self::poll_peek_from 1688 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection poll_peek_sender(&self, cx: &mut Context<'_>) -> Poll<io::Result<SocketAddr>>1689 pub fn poll_peek_sender(&self, cx: &mut Context<'_>) -> Poll<io::Result<SocketAddr>> { 1690 self.io 1691 .registration() 1692 .poll_read_io(cx, || self.peek_sender_inner()) 1693 } 1694 1695 /// Try to retrieve the sender of the data at the head of the input queue. 1696 /// 1697 /// When there is no pending data, `Err(io::ErrorKind::WouldBlock)` is 1698 /// returned. This function is usually paired with `readable()`. 1699 /// 1700 /// Note that the socket address **cannot** be implicitly trusted, because it is relatively 1701 /// trivial to send a UDP datagram with a spoofed origin in a [packet injection attack]. 1702 /// Because UDP is stateless and does not validate the origin of a packet, 1703 /// the attacker does not need to be able to intercept traffic in order to interfere. 1704 /// It is important to be aware of this when designing your application-level protocol. 1705 /// 1706 /// [packet injection attack]: https://en.wikipedia.org/wiki/Packet_injection try_peek_sender(&self) -> io::Result<SocketAddr>1707 pub fn try_peek_sender(&self) -> io::Result<SocketAddr> { 1708 self.io 1709 .registration() 1710 .try_io(Interest::READABLE, || self.peek_sender_inner()) 1711 } 1712 1713 #[inline] peek_sender_inner(&self) -> io::Result<SocketAddr>1714 fn peek_sender_inner(&self) -> io::Result<SocketAddr> { 1715 self.io.try_io(|| { 1716 self.as_socket() 1717 .peek_sender()? 1718 // May be `None` if the platform doesn't populate the sender for some reason. 1719 // In testing, that only occurred on macOS if you pass a zero-sized buffer, 1720 // but the implementation of `Socket::peek_sender()` covers that. 1721 .as_socket() 1722 .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "sender not available")) 1723 }) 1724 } 1725 1726 /// Gets the value of the `SO_BROADCAST` option for this socket. 1727 /// 1728 /// For more information about this option, see [`set_broadcast`]. 1729 /// 1730 /// [`set_broadcast`]: method@Self::set_broadcast broadcast(&self) -> io::Result<bool>1731 pub fn broadcast(&self) -> io::Result<bool> { 1732 self.io.broadcast() 1733 } 1734 1735 /// Sets the value of the `SO_BROADCAST` option for this socket. 1736 /// 1737 /// When enabled, this socket is allowed to send packets to a broadcast 1738 /// address. set_broadcast(&self, on: bool) -> io::Result<()>1739 pub fn set_broadcast(&self, on: bool) -> io::Result<()> { 1740 self.io.set_broadcast(on) 1741 } 1742 1743 /// Gets the value of the `IP_MULTICAST_LOOP` option for this socket. 1744 /// 1745 /// For more information about this option, see [`set_multicast_loop_v4`]. 1746 /// 1747 /// [`set_multicast_loop_v4`]: method@Self::set_multicast_loop_v4 multicast_loop_v4(&self) -> io::Result<bool>1748 pub fn multicast_loop_v4(&self) -> io::Result<bool> { 1749 self.io.multicast_loop_v4() 1750 } 1751 1752 /// Sets the value of the `IP_MULTICAST_LOOP` option for this socket. 1753 /// 1754 /// If enabled, multicast packets will be looped back to the local socket. 1755 /// 1756 /// # Note 1757 /// 1758 /// This may not have any affect on IPv6 sockets. set_multicast_loop_v4(&self, on: bool) -> io::Result<()>1759 pub fn set_multicast_loop_v4(&self, on: bool) -> io::Result<()> { 1760 self.io.set_multicast_loop_v4(on) 1761 } 1762 1763 /// Gets the value of the `IP_MULTICAST_TTL` option for this socket. 1764 /// 1765 /// For more information about this option, see [`set_multicast_ttl_v4`]. 1766 /// 1767 /// [`set_multicast_ttl_v4`]: method@Self::set_multicast_ttl_v4 multicast_ttl_v4(&self) -> io::Result<u32>1768 pub fn multicast_ttl_v4(&self) -> io::Result<u32> { 1769 self.io.multicast_ttl_v4() 1770 } 1771 1772 /// Sets the value of the `IP_MULTICAST_TTL` option for this socket. 1773 /// 1774 /// Indicates the time-to-live value of outgoing multicast packets for 1775 /// this socket. The default value is 1 which means that multicast packets 1776 /// don't leave the local network unless explicitly requested. 1777 /// 1778 /// # Note 1779 /// 1780 /// This may not have any affect on IPv6 sockets. set_multicast_ttl_v4(&self, ttl: u32) -> io::Result<()>1781 pub fn set_multicast_ttl_v4(&self, ttl: u32) -> io::Result<()> { 1782 self.io.set_multicast_ttl_v4(ttl) 1783 } 1784 1785 /// Gets the value of the `IPV6_MULTICAST_LOOP` option for this socket. 1786 /// 1787 /// For more information about this option, see [`set_multicast_loop_v6`]. 1788 /// 1789 /// [`set_multicast_loop_v6`]: method@Self::set_multicast_loop_v6 multicast_loop_v6(&self) -> io::Result<bool>1790 pub fn multicast_loop_v6(&self) -> io::Result<bool> { 1791 self.io.multicast_loop_v6() 1792 } 1793 1794 /// Sets the value of the `IPV6_MULTICAST_LOOP` option for this socket. 1795 /// 1796 /// Controls whether this socket sees the multicast packets it sends itself. 1797 /// 1798 /// # Note 1799 /// 1800 /// This may not have any affect on IPv4 sockets. set_multicast_loop_v6(&self, on: bool) -> io::Result<()>1801 pub fn set_multicast_loop_v6(&self, on: bool) -> io::Result<()> { 1802 self.io.set_multicast_loop_v6(on) 1803 } 1804 1805 /// Gets the value of the `IP_TTL` option for this socket. 1806 /// 1807 /// For more information about this option, see [`set_ttl`]. 1808 /// 1809 /// [`set_ttl`]: method@Self::set_ttl 1810 /// 1811 /// # Examples 1812 /// 1813 /// ```no_run 1814 /// use tokio::net::UdpSocket; 1815 /// # use std::io; 1816 /// 1817 /// # async fn dox() -> io::Result<()> { 1818 /// let sock = UdpSocket::bind("127.0.0.1:8080").await?; 1819 /// 1820 /// println!("{:?}", sock.ttl()?); 1821 /// # Ok(()) 1822 /// # } 1823 /// ``` ttl(&self) -> io::Result<u32>1824 pub fn ttl(&self) -> io::Result<u32> { 1825 self.io.ttl() 1826 } 1827 1828 /// Sets the value for the `IP_TTL` option on this socket. 1829 /// 1830 /// This value sets the time-to-live field that is used in every packet sent 1831 /// from this socket. 1832 /// 1833 /// # Examples 1834 /// 1835 /// ```no_run 1836 /// use tokio::net::UdpSocket; 1837 /// # use std::io; 1838 /// 1839 /// # async fn dox() -> io::Result<()> { 1840 /// let sock = UdpSocket::bind("127.0.0.1:8080").await?; 1841 /// sock.set_ttl(60)?; 1842 /// 1843 /// # Ok(()) 1844 /// # } 1845 /// ``` set_ttl(&self, ttl: u32) -> io::Result<()>1846 pub fn set_ttl(&self, ttl: u32) -> io::Result<()> { 1847 self.io.set_ttl(ttl) 1848 } 1849 1850 /// Gets the value of the `IP_TOS` option for this socket. 1851 /// 1852 /// For more information about this option, see [`set_tos`]. 1853 /// 1854 /// **NOTE:** On Windows, `IP_TOS` is only supported on [Windows 8+ or 1855 /// Windows Server 2012+.](https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options) 1856 /// 1857 /// [`set_tos`]: Self::set_tos 1858 // https://docs.rs/socket2/0.5.3/src/socket2/socket.rs.html#1464 1859 #[cfg(not(any( 1860 target_os = "fuchsia", 1861 target_os = "redox", 1862 target_os = "solaris", 1863 target_os = "illumos", 1864 )))] 1865 #[cfg_attr( 1866 docsrs, 1867 doc(cfg(not(any( 1868 target_os = "fuchsia", 1869 target_os = "redox", 1870 target_os = "solaris", 1871 target_os = "illumos", 1872 )))) 1873 )] tos(&self) -> io::Result<u32>1874 pub fn tos(&self) -> io::Result<u32> { 1875 self.as_socket().tos() 1876 } 1877 1878 /// Sets the value for the `IP_TOS` option on this socket. 1879 /// 1880 /// This value sets the type-of-service field that is used in every packet 1881 /// sent from this socket. 1882 /// 1883 /// **NOTE:** On Windows, `IP_TOS` is only supported on [Windows 8+ or 1884 /// Windows Server 2012+.](https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options) 1885 // https://docs.rs/socket2/0.5.3/src/socket2/socket.rs.html#1446 1886 #[cfg(not(any( 1887 target_os = "fuchsia", 1888 target_os = "redox", 1889 target_os = "solaris", 1890 target_os = "illumos", 1891 )))] 1892 #[cfg_attr( 1893 docsrs, 1894 doc(cfg(not(any( 1895 target_os = "fuchsia", 1896 target_os = "redox", 1897 target_os = "solaris", 1898 target_os = "illumos", 1899 )))) 1900 )] set_tos(&self, tos: u32) -> io::Result<()>1901 pub fn set_tos(&self, tos: u32) -> io::Result<()> { 1902 self.as_socket().set_tos(tos) 1903 } 1904 1905 /// Gets the value for the `SO_BINDTODEVICE` option on this socket 1906 /// 1907 /// This value gets the socket-bound device's interface name. 1908 #[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux",))] 1909 #[cfg_attr( 1910 docsrs, 1911 doc(cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux",))) 1912 )] device(&self) -> io::Result<Option<Vec<u8>>>1913 pub fn device(&self) -> io::Result<Option<Vec<u8>>> { 1914 self.as_socket().device() 1915 } 1916 1917 /// Sets the value for the `SO_BINDTODEVICE` option on this socket 1918 /// 1919 /// If a socket is bound to an interface, only packets received from that 1920 /// particular interface are processed by the socket. Note that this only 1921 /// works for some socket types, particularly `AF_INET` sockets. 1922 /// 1923 /// If `interface` is `None` or an empty string it removes the binding. 1924 #[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] 1925 #[cfg_attr( 1926 docsrs, 1927 doc(cfg(all(any(target_os = "android", target_os = "fuchsia", target_os = "linux")))) 1928 )] bind_device(&self, interface: Option<&[u8]>) -> io::Result<()>1929 pub fn bind_device(&self, interface: Option<&[u8]>) -> io::Result<()> { 1930 self.as_socket().bind_device(interface) 1931 } 1932 1933 /// Executes an operation of the `IP_ADD_MEMBERSHIP` type. 1934 /// 1935 /// This function specifies a new multicast group for this socket to join. 1936 /// The address must be a valid multicast address, and `interface` is the 1937 /// address of the local interface with which the system should join the 1938 /// multicast group. If it's equal to `INADDR_ANY` then an appropriate 1939 /// interface is chosen by the system. join_multicast_v4(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr) -> io::Result<()>1940 pub fn join_multicast_v4(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr) -> io::Result<()> { 1941 self.io.join_multicast_v4(&multiaddr, &interface) 1942 } 1943 1944 /// Executes an operation of the `IPV6_ADD_MEMBERSHIP` type. 1945 /// 1946 /// This function specifies a new multicast group for this socket to join. 1947 /// The address must be a valid multicast address, and `interface` is the 1948 /// index of the interface to join/leave (or 0 to indicate any interface). join_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()>1949 pub fn join_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> { 1950 self.io.join_multicast_v6(multiaddr, interface) 1951 } 1952 1953 /// Executes an operation of the `IP_DROP_MEMBERSHIP` type. 1954 /// 1955 /// For more information about this option, see [`join_multicast_v4`]. 1956 /// 1957 /// [`join_multicast_v4`]: method@Self::join_multicast_v4 leave_multicast_v4(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr) -> io::Result<()>1958 pub fn leave_multicast_v4(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr) -> io::Result<()> { 1959 self.io.leave_multicast_v4(&multiaddr, &interface) 1960 } 1961 1962 /// Executes an operation of the `IPV6_DROP_MEMBERSHIP` type. 1963 /// 1964 /// For more information about this option, see [`join_multicast_v6`]. 1965 /// 1966 /// [`join_multicast_v6`]: method@Self::join_multicast_v6 leave_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()>1967 pub fn leave_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> { 1968 self.io.leave_multicast_v6(multiaddr, interface) 1969 } 1970 1971 /// Returns the value of the `SO_ERROR` option. 1972 /// 1973 /// # Examples 1974 /// ``` 1975 /// use tokio::net::UdpSocket; 1976 /// use std::io; 1977 /// 1978 /// #[tokio::main] 1979 /// async fn main() -> io::Result<()> { 1980 /// // Create a socket 1981 /// let socket = UdpSocket::bind("0.0.0.0:8080").await?; 1982 /// 1983 /// if let Ok(Some(err)) = socket.take_error() { 1984 /// println!("Got error: {:?}", err); 1985 /// } 1986 /// 1987 /// Ok(()) 1988 /// } 1989 /// ``` take_error(&self) -> io::Result<Option<io::Error>>1990 pub fn take_error(&self) -> io::Result<Option<io::Error>> { 1991 self.io.take_error() 1992 } 1993 } 1994 1995 impl TryFrom<std::net::UdpSocket> for UdpSocket { 1996 type Error = io::Error; 1997 1998 /// Consumes stream, returning the tokio I/O object. 1999 /// 2000 /// This is equivalent to 2001 /// [`UdpSocket::from_std(stream)`](UdpSocket::from_std). try_from(stream: std::net::UdpSocket) -> Result<Self, Self::Error>2002 fn try_from(stream: std::net::UdpSocket) -> Result<Self, Self::Error> { 2003 Self::from_std(stream) 2004 } 2005 } 2006 2007 impl fmt::Debug for UdpSocket { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result2008 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 2009 self.io.fmt(f) 2010 } 2011 } 2012 2013 #[cfg(unix)] 2014 mod sys { 2015 use super::UdpSocket; 2016 use std::os::unix::prelude::*; 2017 2018 impl AsRawFd for UdpSocket { as_raw_fd(&self) -> RawFd2019 fn as_raw_fd(&self) -> RawFd { 2020 self.io.as_raw_fd() 2021 } 2022 } 2023 2024 impl AsFd for UdpSocket { as_fd(&self) -> BorrowedFd<'_>2025 fn as_fd(&self) -> BorrowedFd<'_> { 2026 unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } 2027 } 2028 } 2029 } 2030 2031 cfg_windows! { 2032 use crate::os::windows::io::{AsRawSocket, RawSocket}; 2033 use crate::os::windows::io::{AsSocket, BorrowedSocket}; 2034 2035 impl AsRawSocket for UdpSocket { 2036 fn as_raw_socket(&self) -> RawSocket { 2037 self.io.as_raw_socket() 2038 } 2039 } 2040 2041 impl AsSocket for UdpSocket { 2042 fn as_socket(&self) -> BorrowedSocket<'_> { 2043 unsafe { BorrowedSocket::borrow_raw(self.as_raw_socket()) } 2044 } 2045 } 2046 } 2047