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


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

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

Синтаксис

IPHLPAPI_DLL_LINKAGE _NETIOAPI_SUCCESS_ NETIOAPI_API GetIpNetTable2(
  [in]  ADDRESS_FAMILY    Family,
  [out] PMIB_IPNET_TABLE2 *Table
);

Параметры

[in] Family

Семейство адресов, извлекаемого.

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

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

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

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

[out] Table

Указатель на указатель на структуру MIB_IPNET_TABLE2, содержащую таблицу соседних записей IP-адресов на локальном компьютере.

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

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

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

Возвращаемый код Описание
ERROR_INVALID_PARAMETER
Недопустимый параметр был передан функции. Эта ошибка возвращается, если указатель NULL передается в параметре table или параметр семейства не указан как AF_INET, AF_INET6или AF_UNSPEC.
ERROR_NOT_ENOUGH_MEMORY
Недостаточно ресурсов памяти доступны для завершения операции.
ERROR_NOT_FOUND
Не найдены записи ip-адресов соседа, указанные в параметре семейства.

Это возвращаемое значение указывает на то, что вызов функции GetIpNetTable2 getIpNetTable 2 выполнен успешно, но не было возвращаемых данных. Это может произойти, если AF_INET указан в параметре семейства и нет записей ARP для возврата.

ERROR_NOT_SUPPORTED
Запрос не поддерживается.

Эта ошибка возвращается, если на локальном компьютере отсутствует стек IPv4, а AF_INET указан в параметре Family. Эта ошибка также возвращается, если на локальном компьютере отсутствует стек IPv6, а AF_INET6 указан в параметре Family. Эта ошибка также возвращается в версиях Windows, где эта функция не поддерживается.

Другие
Используйте FormatMessage, чтобы получить строку сообщения для возвращаемой ошибки.

Замечания

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

Тем
функция GetIpNetTable2 перечисляет соседние IP-адреса в локальной системе и возвращает эти сведения в структуре MIB_IPNET_TABLE2.

Соседние ЗАПИСИ IP-адресов возвращаются в структуре MIB_IPNET_TABLE2 в буфере, на который указывает параметр Table. Структура MIB_IPNET_TABLE2 содержит число входных ip-адресов соседа и массив структур MIB_IPNET_ROW2 для каждой записи IP-адреса соседа. Если эти возвращаемые структуры больше не требуются, освободите память путем вызова FreeMibTable.

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

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

Примеры

В следующем примере извлекается таблица соседей 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")
#pragma comment(lib, "ws2_32.lib")

int main()
{

    // Declare and initialize variables

    int i;
    unsigned int j;
    unsigned long status = 0;

    PMIB_IPNET_TABLE2 pipTable = NULL;
//    MIB_IPNET_ROW2 ipRow;

    status = GetIpNetTable2(AF_INET, &pipTable);
    if (status != NO_ERROR) {
        printf("GetIpNetTable for IPv4 table returned error: %ld\n", status);
        exit(1);
    }
    // Print some variables from the table
    printf("Number of IPv4 table entries: %d\n\n", pipTable->NumEntries);

    for (i = 0; (unsigned) i < pipTable->NumEntries; i++) {
//        printf("Table entry: %d\n", i);
        printf("IPv4 Address[%d]:\t %s\n", (int) i,
               inet_ntoa(pipTable->Table[i].Address.Ipv4.sin_addr));
        printf("Interface index[%d]:\t\t %lu\n", (int) i,
               pipTable->Table[i].InterfaceIndex);

        printf("Interface LUID NetLuidIndex[%d]:\t %lu\n",
               (int) i, pipTable->Table[i].InterfaceLuid.Info.NetLuidIndex);
        printf("Interface LUID IfType[%d]: ", (int) 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("Physical Address[%d]:\t ", (int) i);
        if (pipTable->Table[i].PhysicalAddressLength == 0)
            printf("\n");
//        for (j = 0; (unsigned) j < pipTable->Table[i].PhysicalAddressLength; j++)
//         printf ("%c" 
        for (j = 0; j < pipTable->Table[i].PhysicalAddressLength; j++) {
            if (j == (pipTable->Table[i].PhysicalAddressLength - 1))
                printf("%.2X\n", (int) pipTable->Table[i].PhysicalAddress[j]);
            else
                printf("%.2X-", (int) pipTable->Table[i].PhysicalAddress[j]);
        }

        printf("Physical Address Length[%d]:\t %lu\n", (int) i,
               pipTable->Table[i].PhysicalAddressLength);

        printf("Neighbor State[%d]:\t ", (int) i);
        switch (pipTable->Table[i].State) {
        case NlnsUnreachable:
            printf("NlnsUnreachable\n");
            break;
        case NlnsIncomplete:
            printf("NlnsIncomplete\n");
            break;
        case NlnsProbe:
            printf("NlnsProbe\n");
            break;
        case NlnsDelay:
            printf("NlnsDelay\n");
            break;
        case NlnsStale:
            printf("NlnsStale\n");
            break;
        case NlnsReachable:
            printf("NlnsReachable\n");
            break;
        case NlnsPermanent:
            printf("NlnsPermanent\n");
            break;
        default:
            printf("Unknown: %d\n", pipTable->Table[i].State);
            break;
        }

        printf("Flags[%d]:\t\t %u\n", (int) i,
               (unsigned char) pipTable->Table[i].Flags);

        printf("ReachabilityTime[%d]:\t %lu\n\n", (int) i,
               pipTable->Table[i].ReachabilityTime);

    }
    FreeMibTable(pipTable);
    pipTable = NULL;

    exit(0);
}

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows Vista [только классические приложения]
минимальный поддерживаемый сервер Windows Server 2008 [только классические приложения]
целевая платформа Виндоус
заголовка netioapi.h (include Iphlpapi.h)
библиотеки Iphlpapi.lib
DLL Iphlpapi.dll

См. также

CreateIpNetEntry2

FlushIpNetTable2

FreeMibTable

GetIpNetEntry2

MIB_IPNET_ROW2

MIB_IPNET_TABLE2

ResolveIpNetEntry2

SetIpNetEntry2