Что такое 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;
}
Другие вопросы по тегам