Поделиться через


Функция GetIpInterfaceTable (netioapi.h)

Функция GetIpInterfaceTable извлекает записи IP-интерфейса на локальном компьютере.

Синтаксис

IPHLPAPI_DLL_LINKAGE _NETIOAPI_SUCCESS_ NETIOAPI_API GetIpInterfaceTable(
  [in]  ADDRESS_FAMILY         Family,
  [out] PMIB_IPINTERFACE_TABLE *Table
);

Параметры

[in] Family

Семейство адресов извлекаемых IP-интерфейсов.

Возможные значения семейства адресов перечислены в файле заголовка Winsock2.h . Обратите внимание, что значения для семейства адресов AF_ и констант семейства протоколов PF_ идентичны (например, AF_INET и PF_INET), поэтому можно использовать любой из констант.

В Windows Vista и более поздних версиях, а также в Windows SDK организация файлов заголовков изменилась, и возможные значения для этого элемента определяются в файле заголовка Ws2def.h. Обратите внимание, что файл заголовка Ws2def.h автоматически включается в Winsock2.h и никогда не должен использоваться напрямую.

В настоящее время поддерживаются значения AF_INET, AF_INET6 и AF_UNSPEC.

Значение Значение
AF_UNSPEC
0
Семейство адресов не указано. Если указан этот параметр, функция GetIpInterfaceTable возвращает таблицу IP-интерфейсов, содержащую записи IPv4 и IPv6.
AF_INET
2
Семейство адресов IPv4.
AF_INET6
23
Семейство адресов IPv6.

[out] Table

Указатель на буфер, который получает таблицу записей ИНТЕРФЕЙСА IP в структуре MIB_IPINTERFACE_TABLE .

Возвращаемое значение

Если функция выполнена успешно, возвращаемое значение будет NO_ERROR.

Если функция завершается сбоем, возвращается один из следующих кодов ошибок.

Код возврата Описание
ERROR_INVALID_PARAMETER
В функцию передан недопустимый параметр. Эта ошибка возвращается, если в параметре Table передается указатель NULL или параметр Family не указан как AF_INET, AF_INET6 или AF_UNSPEC.
ERROR_NOT_ENOUGH_MEMORY
Для завершения операции недостаточно ресурсов памяти.
ERROR_NOT_FOUND
Записи IP-интерфейса, указанные в параметре Family , не найдены.
ERROR_NOT_SUPPORTED
Функция не поддерживается. Эта ошибка возвращается, если ip-транспорт, указанный в параметре Address , не настроен на локальном компьютере. Эта ошибка также возвращается в версиях Windows, где эта функция не поддерживается.
Другое
Используйте функцию FormatMessage , чтобы получить строку сообщения для возвращаемой ошибки.

Комментарии

Функция GetIpInterfaceTable определена в Windows Vista и более поздних версиях.

The
Функция GetIpInterfaceTable перечисляет IP-интерфейсы в локальной системе и возвращает эти сведения в MIB_IPINTERFACE_TABLE структуре.

Записи ИНТЕРФЕЙСА IP возвращаются в MIB_IPINTERFACE_TABLE структуре в буфере, на который указывает параметр Table . Структура MIB_IPINTERFACE_TABLE содержит число записей IP-интерфейса и массив структур MIB_IPINTERFACE_ROW для каждой записи ИНТЕРФЕЙСА IP. Если возвращаемые структуры больше не требуются, освободите память, вызвав FreeMibTable.

Параметр Family должен быть инициализирован AF_INET или AF_INET6.

Обратите внимание, что возвращаемая структура MIB_IPINTERFACE_TABLE , на которую указывает параметр Table, может содержать заполнение для выравнивания между элементом NumEntries и первой записью массива MIB_IPINTERFACE_ROW в элементе Tableструктуры MIB_IPINTERFACE_TABLE . Между записями массива MIB_IPINTERFACE_ROW также может присутствовать заполнение для выравнивания. Любой доступ к записи массива MIB_IPINTERFACE_ROW должен предполагать, что может существовать заполнение.

Примеры

В следующем примере извлекается таблица IP-интерфейса, а затем выводится значения нескольких элементов записей IP-интерфейса в таблице.

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <ws2ipdef.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "iphlpapi.lib")

int main()
{
    // Declare and initialize variables

    int i;

    DWORD dwRetVal = 0;

    PMIB_IPINTERFACE_TABLE pipTable = NULL;

    dwRetVal = GetIpInterfaceTable(AF_UNSPEC, &pipTable);
    if (dwRetVal != NO_ERROR) {
        printf("GetIpInterfaceTable returned error: %ld\n", dwRetVal);
        exit(1);
    }
    // Print some variables from the rows in the table
    printf("Number of table entries: %d\n\n", pipTable->NumEntries);

    for (i = 0; i < (int) pipTable->NumEntries; i++) {
        printf("Address Family[%d]:\t\t", i);
        switch (pipTable->Table[i].Family) {
        case AF_INET:
            printf("IPv4\n");
            break;
        case AF_INET6:
            printf("IPv6\n");
            break;
        default:
            printf("Other: %d\n", pipTable->Table[i].Family);
            break;
        }

        printf("Interface LUID NetLuidIndex[%d]:\t %lu\n",
               i, pipTable->Table[i].InterfaceLuid.Info.NetLuidIndex);

        printf("Interface LUID IfType[%d]:\t ", i);
        switch (pipTable->Table[i].InterfaceLuid.Info.IfType) {
        case IF_TYPE_OTHER:
            printf("Other\n");
            break;
        case IF_TYPE_ETHERNET_CSMACD:
            printf("Ethernet\n");
            break;
        case IF_TYPE_ISO88025_TOKENRING:
            printf("Token ring\n");
            break;
        case IF_TYPE_PPP:
            printf("PPP\n");
            break;
        case IF_TYPE_SOFTWARE_LOOPBACK:
            printf("Software loopback\n");
            break;
        case IF_TYPE_ATM:
            printf("ATM\n");
            break;
        case IF_TYPE_IEEE80211:
            printf("802.11 wireless\n");
            break;
        case IF_TYPE_TUNNEL:
            printf("Tunnel encapsulation\n");
            break;
        case IF_TYPE_IEEE1394:
            printf("IEEE 1394 (Firewire)\n");
            break;
        default:
            printf("Unknown: %d\n",
                   pipTable->Table[i].InterfaceLuid.Info.IfType);
            break;
        }
        printf("Interface Index[%d]:\t\t %lu\n",
               i, pipTable->Table[i].InterfaceIndex);
        printf("Maximum reassembly size[%d]:\t %lu\n", i,
               pipTable->Table[i].MaxReassemblySize);

        printf("Advertising enabled[%d]:\t\t ", i);
        if (pipTable->Table[i].AdvertisingEnabled)
            printf("Yes\n");
        else
            printf("No\n");

        printf("Forwarding enabled[%d]:\t\t ", i);
        if (pipTable->Table[i].ForwardingEnabled)
            printf("Yes\n");
        else
            printf("No\n");

        printf("Network layer MTU[%d]:\t\t %lu\n", i, pipTable->Table[i].NlMtu);

        printf("Connected[%d]:\t\t\t ", i);
        if (pipTable->Table[i].Connected)
            printf("Yes\n");
        else
            printf("No\n");

        printf("Supports wakeup patterns[%d]:\t ", i);
        if (pipTable->Table[i].SupportsWakeUpPatterns)
            printf("Yes\n");
        else
            printf("No\n");

        printf("Supports neighbor discovery[%d]:\t ", i);
        if (pipTable->Table[i].SupportsNeighborDiscovery)
            printf("Yes\n");
        else
            printf("No\n");

        printf("Supports router discovery[%d]:\t ", i);
        if (pipTable->Table[i].SupportsRouterDiscovery)
            printf("Yes\n");
        else
            printf("No\n");

        printf("\n");
    }

    FreeMibTable(pipTable);
    pipTable = NULL;

    exit(0);
}


Требования

Требование Значение
Минимальная версия клиента Windows Vista [только классические приложения]
Минимальная версия сервера Windows Server 2008 [только классические приложения]
Целевая платформа Windows
Header netioapi.h (включая Iphlpapi.h)
Библиотека Iphlpapi.lib
DLL Iphlpapi.dll

См. также раздел

FreeMibTable

GetIfEntry2

GetIfStackTable

GetIfTable2

GetInvertedIfStackTable

GetIpInterfaceEntry

Справочник по вспомогательной функции IP

InitializeIpInterfaceEntry

MIB_IF_ROW2

MIB_IF_TABLE2

MIB_IPINTERFACE_ROW

MIB_IPINTERFACE_TABLE

NotifyIpInterfaceChange