1use std::net::{Ipv4Addr, SocketAddr, UdpSocket};
4
5pub fn local_ipv4() -> Option<Ipv4Addr> {
10 let sock = UdpSocket::bind("0.0.0.0:0").ok()?;
11 sock.connect("8.8.8.8:80").ok()?;
12 match sock.local_addr().ok()? {
13 SocketAddr::V4(a) => Some(*a.ip()),
14 SocketAddr::V6(_) => None,
15 }
16}
17
18pub fn hosts_in_slash24(base: Ipv4Addr) -> Vec<Ipv4Addr> {
21 let o = base.octets();
22 (1u8..=254)
23 .map(|last| Ipv4Addr::new(o[0], o[1], o[2], last))
24 .collect()
25}
26
27#[cfg(test)]
28mod tests {
29 use super::*;
30 use std::net::Ipv4Addr;
31
32 #[test]
33 fn slash24_has_254_hosts_first_and_last() {
34 let h = hosts_in_slash24(Ipv4Addr::new(192, 168, 1, 42));
35 assert_eq!(h.len(), 254);
36 assert_eq!(h[0], Ipv4Addr::new(192, 168, 1, 1));
37 assert_eq!(h[253], Ipv4Addr::new(192, 168, 1, 254));
38 assert!(!h.contains(&Ipv4Addr::new(192, 168, 1, 0)));
40 assert!(!h.contains(&Ipv4Addr::new(192, 168, 1, 255)));
41 }
42}