Я использую GetAdapterAddresses()
метод, чтобы получить IP-адреса всех интерфейсов в системе.
Мне нужно найти широковещательный адрес каждого интерфейса. Я могу рассчитать это, используя IP-адрес и маску подсети, но не вижу маски подсети в структуре IP_ADAPTER_ADDRESSES.
Есть ли способ получить маску подсети, используя GetAdapterAddresses()
?
GetAdapterAddresses()
предоставляет маски подсетей только в Vista и более поздних версиях.
При циклическом просмотре одноадресных адресов, на которые указывает FirstUnicastAddress
поле IP_ADAPTER_ADDRESSES
запись, IP_ADAPTER_UNICAST_ADDRESS
запись включает в себя OnLinkPrefixLength
поле. Это поле недоступно в системах до Vista. Это поле является длиной маски подсети в битах. Для одноадресных адресов IPv4 вы можете использовать ConvertLengthToIpv4Mask()
преобразовать OnLinkPrefixLength
значение в маску подсети, которую затем можно использовать для маскировки IPv4-адреса одноадресной рассылки по мере необходимости.
В системах до Vista, используйте GetIpAddrTable()
получить список доступных интерфейсов IPv4. MIB_IPADDRROW
запись содержит dwAddr
поле для адреса IPv4, dwMask
поле для маски подсети и dwBCastAddr
поле для широковещательного адреса. Вы можете пройтись по этой таблице в поисках каждого одноадресного IPv4-адреса, сообщенного GetAdapterAddresses()
, а затем вы будете иметь связанные с ними маски подсетей и широковещательные IP-адреса.