Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions src/unix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,11 @@ impl PktInfoUdpSocket {
self.socket.join_multicast_v4(addr, interface)
}

/// Drop membership in a multicast group for IPv4.
pub fn leave_multicast_v4(&self, addr: &Ipv4Addr, interface: &Ipv4Addr) -> io::Result<()> {
self.socket.leave_multicast_v4(addr, interface)
}

pub fn set_multicast_if_v4(&self, interface: &Ipv4Addr) -> io::Result<()> {
self.socket.set_multicast_if_v4(interface)
}
Expand All @@ -104,6 +109,11 @@ impl PktInfoUdpSocket {
self.socket.join_multicast_v6(addr, interface)
}

/// Drop membership in a multicast group for IPv6.
pub fn leave_multicast_v6(&self, addr: &Ipv6Addr, interface: u32) -> io::Result<()> {
self.socket.leave_multicast_v6(addr, interface)
}

pub fn set_multicast_if_v6(&self, interface: u32) -> io::Result<()> {
self.socket.set_multicast_if_v6(interface)
}
Expand Down Expand Up @@ -223,4 +233,11 @@ impl PktInfoUdpSocket {
Some(info) => Ok((bytes_recv as _, info)),
}
}

/// Creates a new independently owned std UdpSocket from this PktInfoUdpSocket.
///
/// This is useful to mix and match functionality from this crate with stdlib or other crates.
pub fn try_clone_std(&self) -> io::Result<std::net::UdpSocket> {
Ok(self.socket.try_clone()?.into())
}
}
17 changes: 17 additions & 0 deletions src/win.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,11 @@ impl PktInfoUdpSocket {
self.socket.join_multicast_v4(addr, interface)
}

/// Drop membership in a multicast group for IPv4.
pub fn leave_multicast_v4(&self, addr: &Ipv4Addr, interface: &Ipv4Addr) -> io::Result<()> {
self.socket.leave_multicast_v4(addr, interface)
}

pub fn set_multicast_if_v4(&self, interface: &Ipv4Addr) -> io::Result<()> {
self.socket.set_multicast_if_v4(interface)
}
Expand All @@ -152,6 +157,11 @@ impl PktInfoUdpSocket {
self.socket.join_multicast_v6(addr, interface)
}

/// Drop membership in a multicast group for IPv6.
pub fn leave_multicast_v6(&self, addr: &Ipv6Addr, interface: u32) -> io::Result<()> {
self.socket.leave_multicast_v6(addr, interface)
}

pub fn set_multicast_if_v6(&self, interface: u32) -> io::Result<()> {
self.socket.set_multicast_if_v6(interface)
}
Expand Down Expand Up @@ -268,4 +278,11 @@ impl PktInfoUdpSocket {
Some(info) => Ok((read_bytes as usize, info)),
}
}

/// Creates a new independently owned std UdpSocket from this PktInfoUdpSocket.
///
/// This is useful to mix and match functionality from this crate with stdlib or other crates.
pub fn try_clone_std(&self) -> io::Result<std::net::UdpSocket> {
Ok(self.socket.try_clone()?.into())
}
}
5 changes: 5 additions & 0 deletions tests/ipv4_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ fn ipv4_test() -> io::Result<()> {
socket.set_multicast_ttl_v4(255)?;
socket.bind(&SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), port).into())?;

let std_udp_socket = socket.try_clone_std()?;
assert!(
std_udp_socket.local_addr()? == SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), port)
);

{
let output_socket = Socket::new(Domain::IPV4, Type::DGRAM, Some(Protocol::UDP))?;
let data = "Hello";
Expand Down
6 changes: 6 additions & 0 deletions tests/ipv6_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ fn ipv6_test() -> io::Result<()> {
socket.set_multicast_hops_v6(255)?;
socket.bind(&local_addr)?;

let std_udp_socket = socket.try_clone_std()?;
assert_eq!(
std_udp_socket.local_addr()?,
local_addr.as_socket().unwrap()
);

{
let output_socket = Socket::new(Domain::IPV6, Type::DGRAM, Some(Protocol::UDP))?;
let data = "Hello";
Expand Down
Loading