从 GetAdapterAddresses() 获取子网掩码

Get subnet mask from GetAdapterAddresses()

提问人:jossgray 提问时间:7/12/2014 更新时间:7/12/2014 访问量:8726

问:

我正在使用该方法来获取系统上所有接口的 IP 地址。GetAdapterAddresses()

我需要找到每个接口的广播地址。我可以使用 IP 地址和子网掩码进行计算,但在IP_ADAPTER_ADDRESSES结构中看不到子网掩码。

有没有办法使用检索子网掩码?GetAdapterAddresses()

C++ C WinAPI iphelper

评论


答:

22赞 Remy Lebeau 7/12/2014 #1

GetAdapterAddresses() 仅在 Vista 及更高版本上提供子网掩码。

在循环遍历IP_ADAPTER_ADDRESSES记录的字段指向的单播地址时,IP_ADAPTER_UNICAST_ADDRESS记录包含一个字段。此字段在 Vista 之前的系统上不可用。此字段是子网掩码的长度(以位为单位)。对于 IPv4 单播地址,可以使用 ConvertLengthToIpv4Mask() 将值转换为子网掩码,然后可以根据需要使用子网掩码来掩码单播 IPv4 地址。FirstUnicastAddressOnLinkPrefixLengthOnLinkPrefixLength

在 Vista 之前的系统上,使用 GetIpAddrTable() 获取可用 IPv4 接口的列表。MIB_IPADDRROW记录包含一个 IPv4 地址字段、一个子网掩码字段和一个广播地址字段。您可以遍历该表,查找 报告的每个单播 IPv4 地址,然后您将拥有其关联的子网掩码和广播 IP 地址。dwAddrdwMaskdwBCastAddrGetAdapterAddresses()

评论

0赞 jossgray 7/13/2014
有没有办法将返回的ULONG转换为字符串表示形式(如“255.255.255.0”)?ConvertLengthToIpv4Mask()
0赞 jossgray 7/13/2014
好的,我可以使用in_addr结构并inet_ntoa。谢谢。
1赞 Bryan 1/31/2015
顺便说一句,感谢您的精彩回答!只想补充一点,IP_ADAPTER_UNICAST_ADDRESS 的 MSDN 文档对于 Windows Embedded Compact 7 是错误的。msdn.microsoft.com/en-us/library/......它没有列出 OnLinkPrefixLength,但查看 .h 文件,它就在那里。我已经确认它在那里。(与较新版本相同)。它不存在于 CE 6 或更低版本(正确记录)中。