getIpForwardTable 函数 (iphlpapi.h)
GetIpForwardTable 函数检索 IPv4 路由表。
语法
IPHLPAPI_DLL_LINKAGE DWORD GetIpForwardTable(
[out] PMIB_IPFORWARDTABLE pIpForwardTable,
[in, out] PULONG pdwSize,
[in] BOOL bOrder
);
parameters
[out] pIpForwardTable
指向以MIB_IPFORWARDTABLE结构的形式接收 IPv4 路由表 的缓冲区的 指针。
[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 成员中 0.0.0.0 的 IPv4 地址被视为默认路由。 如果安装了多个网络适配器,MIB_IPFORWARDTABLE可能包含多个MIB_IPFORWARDROW条目,其中 dwForwardDest 成员设置为 0.0.0.0。
当 dwForwardAge 设置为 INFINITE 时,不会根据超时删除路由
值。 dwForwardAge 的任何其他值指定在网络路由表中添加或修改路由后的秒数。
在 Windows Server 2003 或 Windows 2000 Server 上,当路由和远程访问服务 (RRAS) 运行时,返回 的MIB_IPFORWARDROW 条目将 dwForwardType 和 dwForwardAge 成员设置为零。
在 Windows Vista 和 Windows Server 2008 上,在 MIB_IPFORWARDROW 结构的 dwForwardMetric1 成员中指定的路由指标表示添加到关联接口的 MIB_IPINTERFACE_ROW 结构的指标成员中指定的接口指标的组合。 因此,MIB_IPFORWARDROW 结构的 dwForwardMetric1 成员应等于或大于关联MIB_IPINTERFACE_ROW结构的 Metric 成员。 如果应用程序想要在 Windows Vista 和 Windows Server 2008 上将路由指标设置为 0,则应将 MIB_IPFORWARDROW 结构的 dwForwardMetric1 成员设置为等于关联MIB_IPINTERFACE_ROW结构的指标成员中指定的接口指标的值。 应用程序可以通过调用 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 |
Library | Iphlpapi.lib |
DLL | Iphlpapi.dll |