Compartilhar via


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:

  1. Endereço de destino
  2. Protocolo que gerou a rota
  3. Política de roteamento multicamata
  4. 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
ERROR_INSUFFICIENT_BUFFER
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 .
ERROR_INVALID_PARAMETER
O parâmetro pdwSize é NULL ou GetIpForwardTable não consegue gravar na memória apontada pelo parâmetro pdwSize .
ERROR_NO_DATA
Nenhum dado está disponível. Esse erro será retornado se não houver rotas presentes no computador local.
ERROR_NOT_SUPPORTED
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.
Outros
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

Createipforwardentry

DeleteIpForwardEntry

GetIpInterfaceEntry

Referência de função auxiliar de IP

Página Inicial do Auxiliar de IP

MIB_IPFORWARDTABLE

MIB_IPINTERFACE_ROW

Identificadores de protocolo

SetIpForwardEntry