Función GetIpForwardTable (iphlpapi.h)

La función GetIpForwardTable recupera la tabla de enrutamiento IPv4.

Sintaxis

IPHLPAPI_DLL_LINKAGE DWORD GetIpForwardTable(
  [out]     PMIB_IPFORWARDTABLE pIpForwardTable,
  [in, out] PULONG              pdwSize,
  [in]      BOOL                bOrder
);

Parámetros

[out] pIpForwardTable

Puntero a un búfer que recibe la tabla de enrutamiento IPv4 como una estructura de MIB_IPFORWARDTABLE .

[in, out] pdwSize

En la entrada, especifica el tamaño en bytes del búfer al que apunta el parámetro pIpForwardTable .

En la salida, si el búfer no es lo suficientemente grande como para contener la tabla de enrutamiento devuelta, la función establece este parámetro igual al tamaño de búfer necesario en bytes.

[in] bOrder

Valor booleano que especifica si se debe ordenar la tabla devuelta. Si este parámetro es TRUE, la tabla se ordena en el orden de:

  1. Dirección de destino
  2. Protocolo que generó la ruta
  3. Directiva de enrutamiento de múltiples rutas
  4. Dirección del próximo salto

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es NO_ERROR (cero).

Si se produce un error en la función, el valor devuelto es uno de los siguientes códigos de error.

Código devuelto Descripción
ERROR_INSUFFICIENT_BUFFER
El búfer al que apunta el parámetro pIpForwardTable no es lo suficientemente grande. El tamaño necesario se devuelve en la variable DWORD a la que apunta el parámetro pdwSize .
ERROR_INVALID_PARAMETER
El parámetro pdwSize es NULL o GetIpForwardTable no puede escribir en la memoria a la que apunta el parámetro pdwSize .
ERROR_NO_DATA
No hay datos disponibles. Este error se devuelve si no hay rutas presentes en el equipo local.
ERROR_NOT_SUPPORTED
Esta función no se admite en el sistema operativo en uso en el sistema local. Este error se devuelve si no hay ninguna pila IP instalada en el equipo local.
Otros
Use FormatMessage para obtener la cadena de mensaje para el error devuelto.

Comentarios

El miembro dwForwardProto de la estructura MIB_IPFORWARDROW especifica el protocolo o el mecanismo de enrutamiento que generó la ruta. Consulte Identificadores de protocolo para obtener una lista de los posibles protocolos y mecanismos de enrutamiento.

Los miembros dwForwardDest, dwForwardMask y dwForwardNextHop de la estructura MIB_IPFORWARDROW representan una dirección IPv4 en orden de bytes de red.

Una dirección IPv4 de 0.0.0.0 en el miembro dwForwardDest de la estructura de MIB_IPFORWARDROW se considera una ruta predeterminada. El MIB_IPFORWARDTABLE puede contener varias entradas de MIB_IPFORWARDROW con el miembro dwForwardDest establecido en 0.0.0.0 cuando hay varios adaptadores de red instalados.

Cuando dwForwardAge se establece en INFINITE, la ruta no se quitará en función de un tiempo de espera.

. Cualquier otro valor de dwForwardAge especifica el número de segundos desde que se agregó o modificó la ruta en la tabla de enrutamiento de red.

En Windows Server 2003 o Windows 2000 Server cuando se ejecuta el servicio de enrutamiento y acceso remoto (RRAS), las entradas de MIB_IPFORWARDROW devueltas tienen los miembros dwForwardType y dwForwardAge establecidos en cero.

En Windows Vista y Windows Server 2008, la métrica de ruta especificada en el miembro dwForwardMetric1 de la estructura MIB_IPFORWARDROW representa una combinación de la métrica de ruta agregada a la métrica de interfaz especificada en el miembro Métrica de la estructura MIB_IPINTERFACE_ROW de la interfaz asociada. Por lo tanto, el miembro dwForwardMetric1 de la estructura MIB_IPFORWARDROW debe ser igual o mayor que el miembro Metric de la estructura de MIB_IPINTERFACE_ROW asociada. Si una aplicación desea establecer la métrica de ruta en 0 en Windows Vista y Windows Server 2008, el miembro dwForwardMetric1 de la estructura de MIB_IPFORWARDROW debe establecerse igual al valor de la métrica de interfaz especificada en el miembro Métrica de la estructura de MIB_IPINTERFACE_ROW asociada. Una aplicación puede recuperar la métrica de interfaz llamando a la función GetIpInterfaceEntry .

El enrutamiento IPv4 no usa actualmente una serie de miembros de las entradas de estructura de MIB_IPFORWARDROW devueltas por GetIpForwardTable . Estos miembros incluyen dwForwardPolicy, dwForwardNextHopAS, dwForwardMetric2, dwForwardMetric3, dwForwardMetric4 y dwForwardMetric5.

Ejemplos

En el ejemplo siguiente se recupera la tabla de enrutamiento IP y, a continuación, se imprimen algunos campos para cada ruta de la tabla.

// 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 compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado iphlpapi.h
Library Iphlpapi.lib
Archivo DLL Iphlpapi.dll

Consulte también

CreateIpForwardEntry

DeleteIpForwardEntry

GetIpInterfaceEntry

Referencia de la función auxiliar de IP

Página de inicio del asistente de IP

MIB_IPFORWARDTABLE

MIB_IPINTERFACE_ROW

Identificadores de protocolo

SetIpForwardEntry