socket2_ext/
utils.rs

1/// Make behavior look more like unix SO_BINDTODEVICE.
2/// If create many sockets very frequently and need to bind,
3/// it is recommanded to bind using pre-obtained IP directly.
4#[cfg(target_os = "windows")]
5pub fn win_ifname_to_addr(name: &str) -> std::io::Result<std::net::IpAddr> {
6    macro_rules! ioerr {
7        ($e:expr) => {
8            std::io::Error::new(std::io::ErrorKind::NotFound, $e)
9        };
10    }
11
12    let adapters = ipconfig::get_adapters().map_err(|e| ioerr!(e))?;
13    adapters
14        .iter()
15        .find(|a| a.friendly_name() == name)
16        .ok_or_else(|| ioerr!(format!("No such adapter name [{}]", name)))?
17        .ip_addresses()
18        .first()
19        .ok_or_else(|| ioerr!(format!("No such ip address for name [{}]", name)))
20        .copied()
21}