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_INETPF_INET) ,因此可以使用任一常量。

在为 Windows Vista 及更高版本发布的Windows SDK上,头文件的组织已更改,Ws2def.h 头文件中定义了此成员的可能值。 请注意, Ws2def.h 头文件自动包含在 Winsock2.h 中,不应直接使用。

当前支持的值是 AF_INETAF_INET6AF_UNSPEC

含义
AF_UNSPEC
0
未指定地址系列。 指定此参数后,此函数返回包含 IPv4 和 IPv6 条目的邻居 IP 地址表。
AF_INET
2
Internet 协议版本 4 (IPv4) 地址系列。 指定此参数时,此函数返回仅包含 IPv4 条目的邻居 IP 地址表。
AF_INET6
23
Internet 协议版本 6 (IPv6) 地址系列。 指定此参数时,此函数返回仅包含 IPv6 条目的邻居 IP 地址表。

[out] Table

指向 MIB_IPNET_TABLE2 结构的指针,该结构包含本地计算机上的邻居 IP 地址条目表。

返回值

如果函数成功,则返回值NO_ERROR或ERROR_NOT_FOUND。

如果函数失败或未返回任何数据,则返回值为以下错误代码之一。

返回代码 说明
ERROR_INVALID_PARAMETER
向该函数传递了无效参数。 如果在 Table 参数中传递 NULL 指针,或者未将 Family 参数指定为 AF_INETAF_INET6AF_UNSPEC,则返回此错误。
ERROR_NOT_ENOUGH_MEMORY
可用内存资源不足,无法完成该操作。
ERROR_NOT_FOUND
未找到 Family 参数中指定的邻居 IP 地址条目。

此返回值指示对 GetIpNetTable2 函数的调用成功,但没有要返回的数据。 在 Family 参数中指定了AF_INET并且没有要返回的 ARP 条目时,可能会发生这种情况。

ERROR_NOT_SUPPORTED
不支持该请求。

如果本地计算机上没有 IPv4 堆栈,并且 Family 参数中指定了AF_INET,则返回此错误。 如果本地计算机上没有 IPv6 堆栈,并且 Family 参数中指定了AF_INET6,也会返回此错误。 在不支持此函数的 Windows 版本上也会返回此错误。

其他
使用 FormatMessage 获取返回错误的消息字符串。

注解

GetIpNetTable2 函数在 Windows Vista 及更高版本上定义。

The
GetIpNetTable2 函数枚举本地系统上的邻居 IP 地址,并在 MIB_IPNET_TABLE2 结构中返回此信息。

邻居 IP 地址条目在 Table 参数指向的缓冲区中的MIB_IPNET_TABLE2结构中返回。 MIB_IPNET_TABLE2 结构包含每个相邻 IP 地址条目的相邻 IP 地址条目计数和MIB_IPNET_ROW2结构数组。 如果不再需要这些返回的结构,请通过调用 FreeMibTable 释放内存。

Family 参数必须初始化为AF_INETAF_INET6AF_UNSPEC

请注意,Table 参数指向的返回的 MIB_IPNET_TABLE2 结构可能包含 NumEntries 成员与 MIB_IPNET_TABLE2 结构的Table 成员中第一个MIB_IPNET_ROW2数组条目之间的对齐填充。 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 [仅限桌面应用]
目标平台 Windows
标头 netioapi.h (包括 Iphlpapi.h)
Library Iphlpapi.lib
DLL Iphlpapi.dll

另请参阅

CreateIpNetEntry2

FlushIpNetTable2

FreeMibTable

GetIpNetEntry2

MIB_IPNET_ROW2

MIB_IPNET_TABLE2

ResolveIpNetEntry2

SetIpNetEntry2