diff --git a/tokio/src/net/udp.rs b/tokio/src/net/udp.rs index 504d74eb4..7dc72af35 100644 --- a/tokio/src/net/udp.rs +++ b/tokio/src/net/udp.rs @@ -274,6 +274,29 @@ impl UdpSocket { self.io.local_addr() } + /// Returns the socket address of the remote peer this socket was connected + /// to. + /// + /// # Example + /// + /// ``` + /// use tokio::net::UdpSocket; + /// # use std::{io, net::SocketAddr}; + /// + /// # #[tokio::main] + /// # async fn main() -> io::Result<()> { + /// let addr = "127.0.0.1:0".parse::().unwrap(); + /// let peer_addr = "127.0.0.1:11100".parse::().unwrap(); + /// let sock = UdpSocket::bind(addr).await?; + /// sock.connect(peer_addr).await?; + /// assert_eq!(sock.peer_addr()?.ip(), peer_addr.ip()); + /// # Ok(()) + /// # } + /// ``` + pub fn peer_addr(&self) -> io::Result { + self.io.peer_addr() + } + /// Connects the UDP socket setting the default destination for send() and /// limiting packets that are read via recv from the address specified in /// `addr`. diff --git a/tokio/tests/udp.rs b/tokio/tests/udp.rs index ec2a1e961..11a97276c 100644 --- a/tokio/tests/udp.rs +++ b/tokio/tests/udp.rs @@ -3,6 +3,7 @@ use futures::future::poll_fn; use std::io; +use std::net::SocketAddr; use std::sync::Arc; use tokio::{io::ReadBuf, net::UdpSocket}; use tokio_test::assert_ok; @@ -484,3 +485,12 @@ async fn poll_ready() { } } } + +#[tokio::test] +async fn peer_addr() { + let addr = "127.0.0.1:0".parse::().unwrap(); + let peer_addr = "127.0.0.1:11100".parse::().unwrap(); + let sock = UdpSocket::bind(addr).await.unwrap(); + sock.connect(peer_addr).await.unwrap(); + assert_eq!(sock.peer_addr().unwrap().ip(), peer_addr.ip()); +}