Rollup merge of #59106 - LinusU:udp-peer-addr, r=kennytm
Add peer_addr function to UdpSocket Fixes #59104 This is my first pull request to Rust, so opening early for some feedback. My biggest question is: where do I add tests? Any comments very much appreciated!
This commit is contained in:
commit
5481b4e1d7
@ -180,6 +180,37 @@ impl UdpSocket {
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the socket address of the remote peer this socket was connected to.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```no_run
|
||||
/// #![feature(udp_peer_addr)]
|
||||
/// use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4, UdpSocket};
|
||||
///
|
||||
/// let socket = UdpSocket::bind("127.0.0.1:34254").expect("couldn't bind to address");
|
||||
/// socket.connect("192.168.0.1:41203").expect("couldn't connect to address");
|
||||
/// assert_eq!(socket.peer_addr().unwrap(),
|
||||
/// SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(192, 168, 0, 1), 41203)));
|
||||
/// ```
|
||||
///
|
||||
/// If the socket isn't connected, it will return a [`NotConnected`] error.
|
||||
///
|
||||
/// [`NotConnected`]: ../../std/io/enum.ErrorKind.html#variant.NotConnected
|
||||
///
|
||||
/// ```no_run
|
||||
/// #![feature(udp_peer_addr)]
|
||||
/// use std::net::UdpSocket;
|
||||
///
|
||||
/// let socket = UdpSocket::bind("127.0.0.1:34254").expect("couldn't bind to address");
|
||||
/// assert_eq!(socket.peer_addr().unwrap_err().kind(),
|
||||
/// ::std::io::ErrorKind::NotConnected);
|
||||
/// ```
|
||||
#[unstable(feature = "udp_peer_addr", issue = "59127")]
|
||||
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
|
||||
self.0.peer_addr()
|
||||
}
|
||||
|
||||
/// Returns the socket address that this socket was created from.
|
||||
///
|
||||
/// # Examples
|
||||
@ -865,13 +896,23 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn socket_name_ip4() {
|
||||
fn socket_name() {
|
||||
each_ip(&mut |addr, _| {
|
||||
let server = t!(UdpSocket::bind(&addr));
|
||||
assert_eq!(addr, t!(server.local_addr()));
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn socket_peer() {
|
||||
each_ip(&mut |addr1, addr2| {
|
||||
let server = t!(UdpSocket::bind(&addr1));
|
||||
assert_eq!(server.peer_addr().unwrap_err().kind(), ErrorKind::NotConnected);
|
||||
t!(server.connect(&addr2));
|
||||
assert_eq!(addr2, t!(server.peer_addr()));
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn udp_clone_smoke() {
|
||||
each_ip(&mut |addr1, addr2| {
|
||||
|
@ -159,6 +159,10 @@ impl UdpSocket {
|
||||
unsupported()
|
||||
}
|
||||
|
||||
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
|
||||
match self.0 {}
|
||||
}
|
||||
|
||||
pub fn socket_addr(&self) -> io::Result<SocketAddr> {
|
||||
match self.0 {}
|
||||
}
|
||||
|
@ -72,6 +72,11 @@ impl UdpSocket {
|
||||
Ok(None)
|
||||
}
|
||||
|
||||
pub fn peer_addr(&self) -> Result<SocketAddr> {
|
||||
let path = self.0.path()?;
|
||||
Ok(path_to_peer_addr(path.to_str().unwrap_or("")))
|
||||
}
|
||||
|
||||
pub fn socket_addr(&self) -> Result<SocketAddr> {
|
||||
let path = self.0.path()?;
|
||||
Ok(path_to_local_addr(path.to_str().unwrap_or("")))
|
||||
|
@ -249,6 +249,10 @@ impl UdpSocket {
|
||||
unsupported()
|
||||
}
|
||||
|
||||
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
|
||||
match self.0 {}
|
||||
}
|
||||
|
||||
pub fn socket_addr(&self) -> io::Result<SocketAddr> {
|
||||
match self.0 {}
|
||||
}
|
||||
|
@ -292,6 +292,10 @@ pub mod net {
|
||||
|
||||
pub fn into_socket(self) -> Socket { self.inner }
|
||||
|
||||
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
|
||||
unimpl!();
|
||||
}
|
||||
|
||||
pub fn socket_addr(&self) -> io::Result<SocketAddr> {
|
||||
unimpl!();
|
||||
}
|
||||
@ -463,4 +467,3 @@ pub mod net {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -156,6 +156,10 @@ impl UdpSocket {
|
||||
unsupported()
|
||||
}
|
||||
|
||||
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
|
||||
match self.0 {}
|
||||
}
|
||||
|
||||
pub fn socket_addr(&self) -> io::Result<SocketAddr> {
|
||||
match self.0 {}
|
||||
}
|
||||
|
@ -472,6 +472,12 @@ impl UdpSocket {
|
||||
|
||||
pub fn into_socket(self) -> Socket { self.inner }
|
||||
|
||||
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
|
||||
sockname(|buf, len| unsafe {
|
||||
c::getpeername(*self.inner.as_inner(), buf, len)
|
||||
})
|
||||
}
|
||||
|
||||
pub fn socket_addr(&self) -> io::Result<SocketAddr> {
|
||||
sockname(|buf, len| unsafe {
|
||||
c::getsockname(*self.inner.as_inner(), buf, len)
|
||||
|
Loading…
x
Reference in New Issue
Block a user