getIpForwardTable 函式 (iphlpapi.h)
GetIpForwardTable函式會擷取 IPv4 路由表。
語法
IPHLPAPI_DLL_LINKAGE DWORD GetIpForwardTable(
[out] PMIB_IPFORWARDTABLE pIpForwardTable,
[in, out] PULONG pdwSize,
[in] BOOL bOrder
);
參數
[out] pIpForwardTable
接收 IPv4 路由表做為 MIB_IPFORWARDTABLE 結構的緩衝區指標。
[in, out] pdwSize
在輸入時,以位元組為單位指定 pIpForwardTable 參數所指向緩衝區的大小。
在輸出中,如果緩衝區不夠大,無法保存傳回的路由表,函式會將此參數設定為等於所需的緩衝區大小,以位元組為單位。
[in] bOrder
布林值,指定是否應該排序傳回的資料表。 如果此參數為 TRUE,則會依下列順序排序資料表:
- 目的地址
- 產生路由的通訊協定
- 多重路徑路由原則
- 下一個躍點位址
傳回值
如果函式成功,傳回值會 NO_ERROR (零) 。
如果函式失敗,傳回值就是下列其中一個錯誤碼。
傳回碼 | 描述 |
---|---|
|
pIpForwardTable參數指向的緩衝區不夠大。 必要的大小會在pdwSize參數指向的DWORD變數中傳回。 |
|
pdwSize參數為Null,或GetIpForwardTable無法寫入pdwSize參數所指向的記憶體。 |
|
沒有可用的資料。 如果本機電腦上沒有路由,則會傳回此錯誤。 |
|
本機系統上使用的作業系統不支援此函式。 如果本機電腦上未安裝任何 IP 堆疊,就會傳回此錯誤。 |
|
使用 FormatMessage 取得傳回錯誤的訊息字串。 |
備註
MIB_IPFORWARDROW結構的dwForwardProto成員會指定產生路由的通訊協定或路由機制。 如需可能的通訊協定和路由機制清單,請參閱 通訊協定識別碼 。
MIB_IPFORWARDROW結構的dwForwardDest、dwForwardMask和dwForwardNextHop成員會以網路位元組順序表示 IPv4 位址。
MIB_IPFORWARDROW結構dwForwardDest成員中的 IPv4 位址 0.0.0.0 會被視為預設路由。 安裝多個網路介面卡時, MIB_IPFORWARDTABLE 可能包含多個 MIB_IPFORWARDROW 專案, 其中 dwForwardDest 成員設定為 0.0.0.0。
當 dwForwardAge設定為INFINITE時,將不會根據逾時移除路由
值。 dwForwardAge的任何其他值會指定在網路路由表中新增或修改路由之後的秒數。
當路由和遠端存取服務 (RRAS) 執行時,在 Windows Server 2003 或 Windows 2000 Server 上,傳回 的MIB_IPFORWARDROW 專案會將 dwForwardType 和 dwForwardAge 成員設定為零。
在 Windows Vista 和 Windows Server 2008 上,MIB_IPFORWARDROW結構的dwForwardMetric1成員中指定的路由計量,代表新增至相關聯介面MIB_IPINTERFACE_ROW結構之Metric成員中所指定之介面計量的組合。 因此,MIB_IPFORWARDROW結構的dwForwardMetric1成員應該等於或大於相關聯MIB_IPINTERFACE_ROW結構的Metric成員。 如果應用程式想要在 Windows Vista 和 Windows Server 2008 上將路由計量設定為 0,則MIB_IPFORWARDROW結構的dwForwardMetric1成員應該設定為等於相關聯MIB_IPINTERFACE_ROW結構之Metric成員中指定的介面計量值。 應用程式可以藉由呼叫 GetIpInterfaceEntry 函式來擷取介面計量。
IPv4 路由目前不會使用GetIpForwardTable所傳回MIB_IPFORWARDROW結構專案的成員。 這些成員包括 dwForwardPolicy、 dwForwardNextHopAS、 dwForwardMetric2、 dwForwardMetric3、 dwForwardMetric4和 dwForwardMetric5。
範例
下列範例會擷取 IP 路由表,然後列印資料表中每個路由的一些欄位。
// Need to link with Ws2_32.lib and Iphlpapi.lib
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */
int main()
{
// Declare and initialize variables.
/* variables used for GetIfForwardTable */
PMIB_IPFORWARDTABLE pIpForwardTable;
DWORD dwSize = 0;
DWORD dwRetVal = 0;
char szDestIp[128];
char szMaskIp[128];
char szGatewayIp[128];
struct in_addr IpAddr;
int i;
pIpForwardTable =
(MIB_IPFORWARDTABLE *) MALLOC(sizeof (MIB_IPFORWARDTABLE));
if (pIpForwardTable == NULL) {
printf("Error allocating memory\n");
return 1;
}
if (GetIpForwardTable(pIpForwardTable, &dwSize, 0) ==
ERROR_INSUFFICIENT_BUFFER) {
FREE(pIpForwardTable);
pIpForwardTable = (MIB_IPFORWARDTABLE *) MALLOC(dwSize);
if (pIpForwardTable == NULL) {
printf("Error allocating memory\n");
return 1;
}
}
/* Note that the IPv4 addresses returned in
* GetIpForwardTable entries are in network byte order
*/
if ((dwRetVal = GetIpForwardTable(pIpForwardTable, &dwSize, 0)) == NO_ERROR) {
printf("\tNumber of entries: %d\n",
(int) pIpForwardTable->dwNumEntries);
for (i = 0; i < (int) pIpForwardTable->dwNumEntries; i++) {
/* Convert IPv4 addresses to strings */
IpAddr.S_un.S_addr =
(u_long) pIpForwardTable->table[i].dwForwardDest;
strcpy_s(szDestIp, sizeof (szDestIp), inet_ntoa(IpAddr));
IpAddr.S_un.S_addr =
(u_long) pIpForwardTable->table[i].dwForwardMask;
strcpy_s(szMaskIp, sizeof (szMaskIp), inet_ntoa(IpAddr));
IpAddr.S_un.S_addr =
(u_long) pIpForwardTable->table[i].dwForwardNextHop;
strcpy_s(szGatewayIp, sizeof (szGatewayIp), inet_ntoa(IpAddr));
printf("\n\tRoute[%d] Dest IP: %s\n", i, szDestIp);
printf("\tRoute[%d] Subnet Mask: %s\n", i, szMaskIp);
printf("\tRoute[%d] Next Hop: %s\n", i, szGatewayIp);
printf("\tRoute[%d] If Index: %ld\n", i,
pIpForwardTable->table[i].dwForwardIfIndex);
printf("\tRoute[%d] Type: %ld - ", i,
pIpForwardTable->table[i].dwForwardType);
switch (pIpForwardTable->table[i].dwForwardType) {
case MIB_IPROUTE_TYPE_OTHER:
printf("other\n");
break;
case MIB_IPROUTE_TYPE_INVALID:
printf("invalid route\n");
break;
case MIB_IPROUTE_TYPE_DIRECT:
printf("local route where next hop is final destination\n");
break;
case MIB_IPROUTE_TYPE_INDIRECT:
printf
("remote route where next hop is not final destination\n");
break;
default:
printf("UNKNOWN Type value\n");
break;
}
printf("\tRoute[%d] Proto: %ld - ", i,
pIpForwardTable->table[i].dwForwardProto);
switch (pIpForwardTable->table[i].dwForwardProto) {
case MIB_IPPROTO_OTHER:
printf("other\n");
break;
case MIB_IPPROTO_LOCAL:
printf("local interface\n");
break;
case MIB_IPPROTO_NETMGMT:
printf("static route set through network management \n");
break;
case MIB_IPPROTO_ICMP:
printf("result of ICMP redirect\n");
break;
case MIB_IPPROTO_EGP:
printf("Exterior Gateway Protocol (EGP)\n");
break;
case MIB_IPPROTO_GGP:
printf("Gateway-to-Gateway Protocol (GGP)\n");
break;
case MIB_IPPROTO_HELLO:
printf("Hello protocol\n");
break;
case MIB_IPPROTO_RIP:
printf("Routing Information Protocol (RIP)\n");
break;
case MIB_IPPROTO_IS_IS:
printf
("Intermediate System-to-Intermediate System (IS-IS) protocol\n");
break;
case MIB_IPPROTO_ES_IS:
printf("End System-to-Intermediate System (ES-IS) protocol\n");
break;
case MIB_IPPROTO_CISCO:
printf("Cisco Interior Gateway Routing Protocol (IGRP)\n");
break;
case MIB_IPPROTO_BBN:
printf("BBN Internet Gateway Protocol (IGP) using SPF\n");
break;
case MIB_IPPROTO_OSPF:
printf("Open Shortest Path First (OSPF) protocol\n");
break;
case MIB_IPPROTO_BGP:
printf("Border Gateway Protocol (BGP)\n");
break;
case MIB_IPPROTO_NT_AUTOSTATIC:
printf("special Windows auto static route\n");
break;
case MIB_IPPROTO_NT_STATIC:
printf("special Windows static route\n");
break;
case MIB_IPPROTO_NT_STATIC_NON_DOD:
printf
("special Windows static route not based on Internet standards\n");
break;
default:
printf("UNKNOWN Proto value\n");
break;
}
printf("\tRoute[%d] Age: %ld\n", i,
pIpForwardTable->table[i].dwForwardAge);
printf("\tRoute[%d] Metric1: %ld\n", i,
pIpForwardTable->table[i].dwForwardMetric1);
}
FREE(pIpForwardTable);
return 0;
} else {
printf("\tGetIpForwardTable failed.\n");
FREE(pIpForwardTable);
return 1;
}
}
需求
最低支援的用戶端 | Windows 2000 Professional [僅限傳統型應用程式] |
最低支援的伺服器 | Windows 2000 Server [僅限桌面應用程式] |
目標平台 | Windows |
標頭 | iphlpapi.h |
程式庫 | Iphlpapi.lib |
Dll | Iphlpapi.dll |