1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/// Make behavior look more like unix SO_BINDTODEVICE.
/// If create many sockets very frequently and need to bind,
/// it is recommanded to bind using pre-obtained IP directly.
#[cfg(target_os = "windows")]
pub fn win_ifname_to_addr(name: &str) -> std::io::Result<std::net::IpAddr> {
    macro_rules! ioerr {
        ($e:expr) => {
            std::io::Error::new(std::io::ErrorKind::NotFound, $e)
        };
    }

    let adapters = ipconfig::get_adapters().map_err(|e| ioerr!(e))?;
    adapters
        .iter()
        .find(|a| a.friendly_name() == name)
        .ok_or_else(|| ioerr!(format!("No such adapter name [{}]", name)))?
        .ip_addresses()
        .first()
        .ok_or_else(|| ioerr!(format!("No such ip address for name [{}]", name)))
        .copied()
}