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

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

当前支持的值是 AF_INETAF_INET6AF_UNSPEC

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

[out] Table

指向缓冲区的指针,该缓冲区接收 MIB_IPINTERFACE_TABLE 结构中的 IP 接口条目表。

返回值

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

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

返回代码 说明
ERROR_INVALID_PARAMETER
向该函数传递了无效参数。 如果在 Table 参数中传递 NULL 指针,或者 Family 参数未指定为AF_INETAF_INET6AF_UNSPEC,则返回此错误。
ERROR_NOT_ENOUGH_MEMORY
内存资源不足,无法完成操作。
ERROR_NOT_FOUND
未找到 Family 参数中指定的 IP 接口条目。
ERROR_NOT_SUPPORTED
不支持 函数。 如果未在本地计算机上配置 Address 参数中指定的 IP 传输,则返回此错误。 在不支持此函数的 Windows 版本上也会返回此错误。
其他
使用 FormatMessage 函数获取返回错误的消息字符串。

注解

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

The
GetIpInterfaceTable 函数枚举本地系统上的 IP 接口,并在 MIB_IPINTERFACE_TABLE 结构中返回此信息。

IP 接口条目在 Table 参数指向的缓冲区中的MIB_IPINTERFACE_TABLE结构中返回。 MIB_IPINTERFACE_TABLE结构包含 IP 接口条目计数和每个 IP 接口条目的MIB_IPINTERFACE_ROW结构数组。 当不再需要这些返回的结构时,通过调用 FreeMibTable 释放内存。

Family 参数必须初始化为 AF_INETAF_INET6

请注意,Table 参数指向的返回MIB_IPINTERFACE_TABLE结构可能包含 NumEntries 成员与 MIB_IPINTERFACE_TABLE 结构的Table 成员中的第一个MIB_IPINTERFACE_ROW数组条目之间的对齐填充。 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
标头 netioapi.h (包括 Iphlpapi.h)
Library 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