Что такое API IPHelper для получения информации о сетевой маске?
Моя первая ставка была GetIpAddrTable()
как был пример кода, но он поддерживает только IPv4. Потом я попробовал GetAdaptersInfo()
, но документ предполагает, что он устарел GetAdaptersAddresses()
, Какой-нибудь пример кода для получения маски сети с помощью GetAdaptersAdresses() или любого другого API-помощника IP следует использовать?
1 ответ
Для IPv4 вы можете вызывать WSAIoctl с сокетом AF_INET и флагом SIO_GET_INTERFACE_LIST. Это вернет вам массив структур INTERFACE_INFO, которые содержат набор адресов IP, Netmask и Broadcast. Смотрите пример кода ниже.
Для IPv6 концепция "NetMask" не применяется так же, как в IPv4. Смотрите здесь для более подробной информации. Заметили ли вы, что, когда вы вводите "ipconfig" из командной строки или пытаетесь вручную установить адрес IPv6 с панели управления, поле "маска маски" не отображается?
Таким образом, вы можете использовать SIO_GET_INTERFACE_LIST или GetIpAddrTable для маски сети ваших интерфейсов IPv4. Но для IPv6 вам, вероятно, придется уточнить, что вы действительно пытаетесь сделать с этой информацией.
int _tmain(int argc, _TCHAR* argv[])
{
WSAData data = {};
sockaddr_in addrLocal = {};
INTERFACE_INFO infolist[100] = {};
DWORD dwBytesReturned = 0;
DWORD dwNumInterfaces = 0;
::WSAStartup(MAKEWORD(2,2), &data);
int s = socket(AF_INET, SOCK_DGRAM, 0);
int result = WSAIoctl(s, SIO_GET_INTERFACE_LIST, NULL, 0, (void*)infolist, sizeof(infolist), &dwBytesReturned, NULL, NULL);
dwNumInterfaces = dwBytesReturned / sizeof(INTERFACE_INFO);
for (DWORD index = 0; index < dwNumInterfaces; index++)
{
char szIP[120]={};
char szBroadcast[120]={};
char szNetMask[120]={};
if (infolist[index].iiAddress.Address.sa_family == AF_INET)
{
// ipv4
sockaddr_in* pAddr4 = &infolist[index].iiAddress.AddressIn;
inet_ntop(AF_INET, &pAddr4->sin_addr, szIP, ARRAYSIZE(szIP));
pAddr4 = &infolist[index].iiBroadcastAddress.AddressIn;
inet_ntop(AF_INET, &pAddr4->sin_addr, szBroadcast, ARRAYSIZE(szBroadcast));
pAddr4 = &infolist[index].iiNetmask.AddressIn;
inet_ntop(AF_INET, &pAddr4->sin_addr, szNetMask, ARRAYSIZE(szNetMask));
}
else
{
continue;
}
printf("IP:%s NetMask:%s Broadcast:%s\n", szIP, szNetMask, szBroadcast);
}
return 0;
}