Get subnet mask from GetAdapterAddresses()

c, c++, iphelper, winapi

Solution

`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.

Problem

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()`?

Original source