use std::net::{IpAddr, Ipv4Addr, TcpListener, ToSocketAddrs, UdpSocket};
pub fn get_local_ipv4() -> Option<Ipv4Addr> {
let addrs = local_ip_address::list_afinet_netifas().ok()?;
for (_name, ip) in addrs {
if let IpAddr::V4(v4) = ip {
if !v4.is_loopback() {
return Some(v4);
}
}
}
None
}
pub fn get_hostname() -> Option<String> {
hostname::get().ok().and_then(|s| s.into_string().ok())
}
pub fn resolve_hostname(host: &str, port: u16) -> Vec<IpAddr> {
let addr_str = format!("{}:{}", host, port);
addr_str
.to_socket_addrs()
.map(|iter| iter.map(|sa| sa.ip()).collect())
.unwrap_or_default()
}
pub fn is_port_in_use(port: u16) -> bool {
TcpListener::bind(("0.0.0.0", port)).is_err()
}
pub fn is_udp_port_in_use(port: u16) -> bool {
UdpSocket::bind(("0.0.0.0", port)).is_err()
}