#winapi #windows #networking #ip-address #adapter #enumerate #associated

get_adapters_addresses

封装了win32的GetAdaptersAddresses()函数。枚举网络接口及其相关IP地址。

2个版本

0.1.1 2023年7月27日
0.1.0 2023年7月24日

#122 in Windows API

MIT/Apache

38KB
919

这是什么!?

此crate提供了对win32函数GetAdaptersAddresses的Rust接口。

为什么!?

windows crate。但是函数GetAdaptersAddresses使用起来并不愉快。

  • 用户预计需要使用HeapAlloc/HeapFree来管理输出内存。
  • 用户预计需要遍历适配器和地址的链表。
  • 用户预计需要将*SOCKADDR转换为*SOCKADDR_IN / *SOCKADDR_IN6来解释它。
  • 这都是不安全的。

那么它是如何工作的呢!?

结构体AdaptersAddresses分配并拥有GetAdaptersAddresses()写入的缓冲区。
遍历它会产生Adapter
适配器可以通过查询其各种属性进行查询,通常是可迭代的。

示例!

use get_adapters_addresses::*;
fn main() -> Result<()> {
    let adapter_addresses =
        AdaptersAddresses::try_new(Family::Unspec, *Flags::default().include_gateways())?;

    for adapter in &adapter_addresses {
        println!("============================================================");
        println!("adapter name: {:?}", adapter.adapter_name());
        println!("friendly name: {:?}", adapter.friendly_name());
        println!("description: {:?}", adapter.description());
        println!("interface_type {:?}", adapter.interface_type());
        if let Some(physical_address) = adapter.physical_address() {
            println!(
                "physical_address: {} {{{:X}}}",
                physical_address,
                physical_address.as_u64()
            );
        }
        println!("status: {:?}", adapter.operational_status());
        for addr in adapter.unicast_addresses() {
            println!("\tunicast: {:?}", addr);
        }
        for addr in adapter.multicast_addresses() {
            println!("\tmulticast: {:?}", addr);
        }
        for addr in adapter.anycast_addresses() {
            println!("\tanycast: {:?}", addr);
        }
        for addr in adapter.dns_addresses() {
            println!("\tdns: {:?}", addr);
        }
        for addr in adapter.gateway_addresses() {
            println!("\tgateway: {:?}", addr);
        }
        println!("\tdhcpv4: {:?}", adapter.dhcpv4_address());
        println!("\tdhcpv6: {:?}", adapter.dhcpv6_address());
    }
    Ok(())
}

依赖项

~0.3–12MB
~104K SLoC