共用方式為


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
因特網通訊協定第 4 版 (IPv4) 位址系列。 指定此參數時,此函式會傳回只包含IPv4項目的鄰近IP位址數據表。
AF_INET6
23
因特網通訊協定第 6 版 (IPv6) 位址系列。 指定此參數時,此函式會傳回只包含IPv6項目的鄰近IP位址數據表。

[out] Table

MIB_IPNET_TABLE2 結構的指標,其中包含本機計算機上的鄰近IP位址專案數據表。

傳回值

如果函式成功,傳回值會NO_ERROR或ERROR_NOT_FOUND。

如果函式失敗或未傳回任何數據,則傳回值是下列其中一個錯誤碼。

傳回碼 Description
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)
程式庫 Iphlpapi.lib
Dll Iphlpapi.dll

另請參閱

CreateIpNetEntry2

FlushIpNetTable2

FreeMibTable

GetIpNetEntry2

MIB_IPNET_ROW2

MIB_IPNET_TABLE2

ResolveIpNetEntry2

SetIpNetEntry2