Get subnet mask from GetAdapterAddresses()

jossgray picture jossgray · Jul 11, 2014 · Viewed 7.3k times · Source

I'm using the GetAdapterAddresses() method to get the ip addresses of all interfaces on the system.

I need to find the broadcast address of each interface. I can calculate this using the IP address and the subnet mask but I can't see the subnet mask in the IP_ADAPTER_ADDRESSES structure.

Is there any way to retrieve the subnet mask using GetAdapterAddresses()?

Answer

Remy Lebeau picture Remy Lebeau · Jul 11, 2014

GetAdapterAddresses() provides subnet masks only on Vista and later.

When looping through the unicast addresses pointed to by the FirstUnicastAddress field of the IP_ADAPTER_ADDRESSES record, the IP_ADAPTER_UNICAST_ADDRESS record includes an OnLinkPrefixLength field. This field is not available on pre-Vista systems. This field is the length of the subnet mask, in bits. For IPv4 unicast addresses, you can use ConvertLengthToIpv4Mask() to convert the OnLinkPrefixLength value into a subnet mask, which you can then use to mask the unicast IPv4 address as needed.

On pre-Vista systems, use GetIpAddrTable() to get a list of the available IPv4 interfaces. The MIB_IPADDRROW record contains a dwAddr field for the IPv4 address, a dwMask field for the subnet mask, and a dwBCastAddr field for the broadcast address. You can loop through that table looking for each unicast IPv4 address reported by GetAdapterAddresses(), and then you will have their associated subnet masks and broadcast IP addresses.