Получить маску подсети из GetAdapterAddresses()

Я использую GetAdapterAddresses() метод, чтобы получить IP-адреса всех интерфейсов в системе.

Мне нужно найти широковещательный адрес каждого интерфейса. Я могу рассчитать это, используя IP-адрес и маску подсети, но не вижу маски подсети в структуре IP_ADAPTER_ADDRESSES.

Есть ли способ получить маску подсети, используя GetAdapterAddresses()?

1 ответ

Решение

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-адреса.

Другие вопросы по тегам