是否存在已文档化的WinAPI方法以获取已断开网络适配器的静态IP地址?
是否存在已文档化的WinAPI方法以获取已断开网络适配器的静态IP地址?
当然有啦!完全不用再依赖那些不稳定的未文档化代码冒风险了,Windows提供了几个官方文档化的WinAPI,能稳定获取到即使网络断开的适配器的静态IP配置,效果和你用netsh interface ip show ipaddresses命令拿到的信息完全一致。
最推荐的是GetAdaptersAddresses这个核心API,它是微软官方完全文档化的,能枚举系统里所有网络适配器(包括已断开连接的),并返回完整的IP配置信息。使用的时候要注意设置正确的标志位:
- 调用时指定
GAA_FLAG_INCLUDE_ALL_INTERFACES,这样就不会过滤掉处于断开状态的适配器 - 如果还需要网关、DNS等额外配置,可以搭配
GAA_FLAG_INCLUDE_GATEWAYS、GAA_FLAG_INCLUDE_DNS_SERVERS这类标志
具体用起来也不复杂:
- 先以空缓冲区调用一次
GetAdaptersAddresses,拿到需要的缓冲区大小 - 分配足够的内存作为输出缓冲区
- 再次调用
GetAdaptersAddresses,地址族传AF_UNSPEC就能同时获取IPv4和IPv6地址,再带上之前说的标志位 - 遍历返回的
IP_ADAPTER_ADDRESSES链表,每个节点对应一个适配器,节点里的FirstUnicastAddress链表就是这个适配器的所有IP地址 - 每个
IP_ADAPTER_UNICAST_ADDRESS节点里的Sockaddr字段能拿到具体的IP地址,还可以通过PrefixOrigin字段判断这个IP是静态配置的(对应IP_PREFIX_ORIGIN_MANUAL)还是DHCP分配的
如果你只需要IPv4的基础信息,GetIpAddrTable也是个文档化的选项,它返回的IP地址表也会包含已断开适配器的静态配置,不过它的信息不如GetAdaptersAddresses全面,如果你需要更多适配器相关的细节,还是前者更合适。
你之前用的那种未文档化的C函数,虽然现在能用,但微软随时可能在系统更新里修改内部实现,到时候程序要么崩要么拿不到数据,换成这些官方API就完全没这个顾虑了,在Windows XP及以上的系统都能稳定运行。
备注:内容来源于stack exchange,提问作者George Robinson
相关产品推荐
相关产品推荐

