1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
use std::net::{Ipv4Addr, Ipv6Addr, SocketAddrV4, SocketAddrV6, TcpListener, ToSocketAddrs};
fn test_bind<A: ToSocketAddrs>(addr: A) -> bool {
match TcpListener::bind(addr).map(|t| t.local_addr().is_ok()) {
Ok(result) => result,
Err(_) => false,
}
}
pub fn is_port_free(port: u16) -> bool {
let ipv4 = SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, port);
let ipv6 = SocketAddrV6::new(Ipv6Addr::UNSPECIFIED, port, 0, 0);
test_bind(ipv6) && test_bind(ipv4)
}