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) ,因此可以使用任一個常數。
在針對 Windows Vista 和更新版本發行的 Windows SDK 上,頭檔的組織已變更,而且此成員的可能值定義在 Ws2def.h 頭檔中。 請注意, Ws2def.h 頭文件會自動包含在 Winsock2.h 中,不應該直接使用。
目前支援的值是 AF_INET、 AF_INET6和 AF_UNSPEC。
[out] Table
MIB_IPNET_TABLE2 結構的指標,其中包含本機計算機上的鄰近IP位址專案數據表。
傳回值
如果函式成功,傳回值會NO_ERROR或ERROR_NOT_FOUND。
如果函式失敗或未傳回任何數據,則傳回值是下列其中一個錯誤碼。
傳回碼 | Description |
---|---|
|
無效的參數已傳遞至 函式。 如果在 Table 參數中傳遞 NULL 指標,或 Family 參數未指定為 AF_INET、AF_INET6 或 AF_UNSPEC,則會傳回此錯誤。 |
|
記憶體資源不足,無法完成作業。 |
|
找不到 在 Family 參數中指定的鄰近 IP 位址專案。
這個傳回值表示 對 GetIpNetTable2 函式的呼叫成功,但沒有任何數據可傳回。 當 Family 參數中指定了 AF_INET,而且沒有ARP專案可傳回時,就會發生這種情況。 |
|
不支援此要求。
如果本機計算機上沒有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_INET、AF_INET6 或 AF_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 |