Função GetIpForwardTable (iphlpapi.h)
A função GetIpForwardTable recupera a tabela de roteamento IPv4.
Sintaxe
IPHLPAPI_DLL_LINKAGE DWORD GetIpForwardTable(
[out] PMIB_IPFORWARDTABLE pIpForwardTable,
[in, out] PULONG pdwSize,
[in] BOOL bOrder
);
Parâmetros
[out] pIpForwardTable
Um ponteiro para um buffer que recebe a tabela de roteamento IPv4 como uma estrutura de MIB_IPFORWARDTABLE .
[in, out] pdwSize
Na entrada, especifica o tamanho em bytes do buffer apontado pelo parâmetro pIpForwardTable .
Na saída, se o buffer não for grande o suficiente para manter a tabela de roteamento retornada, a função definirá esse parâmetro igual ao tamanho do buffer necessário em bytes.
[in] bOrder
Um valor booliano que especifica se a tabela retornada deve ser classificada. Se esse parâmetro for TRUE, a tabela será classificada na ordem de:
- Endereço de destino
- Protocolo que gerou a rota
- Política de roteamento multicamata
- Endereço do próximo salto
Valor retornado
Se a função for bem-sucedida, o valor retornado será NO_ERROR (zero).
Se a função falhar, o valor retornado será um dos seguintes códigos de erro.
Código de retorno | Descrição |
---|---|
|
O buffer apontado pelo parâmetro pIpForwardTable não é grande o suficiente. O tamanho necessário é retornado na variável DWORD apontada pelo parâmetro pdwSize . |
|
O parâmetro pdwSize é NULL ou GetIpForwardTable não consegue gravar na memória apontada pelo parâmetro pdwSize . |
|
Nenhum dado está disponível. Esse erro será retornado se não houver rotas presentes no computador local. |
|
Não há suporte para essa função no sistema operacional em uso no sistema local. Esse erro será retornado se não houver nenhuma pilha de IP instalada no computador local. |
|
Use FormatMessage para obter a cadeia de caracteres de mensagem para o erro retornado. |
Comentários
O membro dwForwardProto da estrutura MIB_IPFORWARDROW especifica o protocolo ou o mecanismo de roteamento que gerou a rota. Consulte Identificadores de protocolo para obter uma lista de possíveis protocolos e mecanismos de roteamento.
Os membros dwForwardDest, dwForwardMask e dwForwardNextHop da estrutura MIB_IPFORWARDROW representam um endereço IPv4 na ordem de byte de rede.
Um endereço IPv4 de 0.0.0.0 no membro dwForwardDest da estrutura MIB_IPFORWARDROW é considerado uma rota padrão. O MIB_IPFORWARDTABLE pode conter várias entradas MIB_IPFORWARDROW com o membro dwForwardDest definido como 0.0.0.0 quando há vários adaptadores de rede instalados.
Quando dwForwardAge estiver definido como INFINITE, a rota não será removida com base em um tempo limite
value. Qualquer outro valor para dwForwardAge especifica o número de segundos desde que a rota foi adicionada ou modificada na tabela de roteamento de rede.
No Windows Server 2003 ou Windows 2000 Server quando o Serviço de Roteamento e Acesso Remoto (RRAS) estiver em execução, as entradas de MIB_IPFORWARDROW retornadas têm os membros dwForwardType e dwForwardAge definidos como zero.
No Windows Vista e no Windows Server 2008, a métrica de rota especificada no membro dwForwardMetric1 da estrutura MIB_IPFORWARDROW representa uma combinação da métrica de rota adicionada à métrica de interface especificada no membro Métrica da estrutura MIB_IPINTERFACE_ROW da interface associada. Portanto, o membro dwForwardMetric1 da estrutura MIB_IPFORWARDROW deve ser igual ou maior que o membro Metric da estrutura de MIB_IPINTERFACE_ROW associada. Se um aplicativo quiser definir a métrica de rota como 0 no Windows Vista e no Windows Server 2008, o membro dwForwardMetric1 da estrutura MIB_IPFORWARDROW deverá ser definido igual ao valor da métrica de interface especificada no membro Métrica da estrutura de MIB_IPINTERFACE_ROW associada. Um aplicativo pode recuperar a métrica de interface chamando a função GetIpInterfaceEntry .
Vários membros das entradas de estrutura MIB_IPFORWARDROW retornadas por GetIpForwardTable não são usados atualmente pelo roteamento IPv4. Esses membros incluem dwForwardPolicy, dwForwardNextHopAS, dwForwardMetric2, dwForwardMetric3, dwForwardMetric4 e dwForwardMetric5.
Exemplos
O exemplo a seguir recupera a tabela de roteamento de IP e, em seguida, imprime alguns campos para cada rota na tabela.
// 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;
}
}
Requisitos
Cliente mínimo com suporte | Windows 2000 Professional [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte | Windows 2000 Server [somente aplicativos da área de trabalho] |
Plataforma de Destino | Windows |
Cabeçalho | iphlpapi.h |
Biblioteca | Iphlpapi.lib |
DLL | Iphlpapi.dll |
Confira também
Referência de função auxiliar de IP