Если вы возьмете пример MSDN внутри IP_ADAPTER_ADDRESSES Структура в Windows 7 с пакетом обновления 1 (SP1), то разверните перечисление одноадресных адресов:
char s[1024];
for (i = 0; pUnicast != NULL; i++) {
inet_ntop (pUnicast->Address.lpSockaddr->sa_family,
pUnicast->Address.lpSockaddr->sa_family == AF_INET ?
(PVOID)&((struct sockaddr_in*)pUnicast->Address.lpSockaddr)->sin_addr :
(PVOID)&((struct sockaddr_in6*)pUnicast->Address.lpSockaddr)->sin6_addr,
s, sizeof (s));
printf ("\t#%lu %s/%u\n",
i, s, (unsigned)pUnicast->OnLinkPrefixLength);
pUnicast = pUnicast->Next;
}
и префиксные данные:
char s[1024];
for (i = 0; pPrefix != NULL; i++) {
inet_ntop (pPrefix->Address.lpSockaddr->sa_family,
pPrefix->Address.lpSockaddr->sa_family == AF_INET ?
(PVOID)&((struct sockaddr_in*)pPrefix->Address.lpSockaddr)->sin_addr :
(PVOID)&((struct sockaddr_in6*)pPrefix->Address.lpSockaddr)->sin6_addr,
s, sizeof (s));
printf ("\t#%lu %s/%u\n",
i, s, pPrefix->PrefixLength);
pPrefix = pPrefix->Next;
}
Но один адаптер показывает следующий вывод:
Length of the IP_ADAPTER_ADDRESS struct: 376
IfIndex (IPv4 interface): 15
Adapter name: {84C25EC1-7ABB-4D6E-B8C7-8DEE08961EE2}
#0 2001:0:4137:9e76:2443:d6:ba87:1a2a/64
#1 fe80::2443:d6:ba87:1a2a/64
Number of Unicast Addresses: 2
...
#0 ::/0
#1 2001::/32
#2 2001:0:4137:9e76:2443:d6:ba87:1a2a/128
#3 fe80::/64
#4 fe80::2443:d6:ba87:1a2a/128
#5 ff00::/8
Number of IP Adapter Prefix entries: 6
Список префиксов верен, хотя и немного расширен по описанию MSDN 3 адресов:
В Windows Vista и более поздних версиях,связанные структуры IP_ADAPTER_PREFIX, на которые указывает член FirstPrefix, включают три префикса IP-адаптера для каждого IP-адреса, назначенного адаптеру.К ним относятся префикс IP-адреса хоста, префикс IP-адреса подсети и префикс широковещательного IP-адреса подсети.Кроме того, для каждого адаптера есть префикс адреса многоадресной рассылки и префикс широковещательного адреса.
Я определяю, что список правильный, сравнивая с выводом netstat -r
:
IPv6 Route Table
==================================================
Active Routes:
If Metric Network Destination Gateway
15 58 ::/0 On-link
1 306 ::1/128 On-link
15 58 2001::/32 On-link
15 306 2001:0:4137:9e76:2443:d6:ba87:1a2a/128
On-link
14 281 fe80::/64 On-link
15 306 fe80::/64 On-link
15 306 fe80::2443:d6:ba87:1a2a/128
On-link
14 281 fe80::6153:a573:f691:8167/128
On-link
1 306 ff00::/8 On-link
15 306 ff00::/8 On-link
14 281 ff00::/8 On-link
==================================================
Однако моя интерпретация API заключается в том, что OnLinkPrefixLength
должен возвращать 32 для одноадресного адреса глобальной области, а API только для Vista + возвращает 64, почему?