Partager via


GetIpForwardTable, fonction (iphlpapi.h)

La fonction GetIpForwardTable récupère la table de routage IPv4.

Syntaxe

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

Paramètres

[out] pIpForwardTable

Pointeur vers une mémoire tampon qui reçoit la table de routage IPv4 en tant que structure MIB_IPFORWARDTABLE .

[in, out] pdwSize

Lors de l’entrée, spécifie la taille en octets de la mémoire tampon vers laquelle pointe le paramètre pIpForwardTable .

En sortie, si la mémoire tampon n’est pas assez grande pour contenir la table de routage retournée, la fonction définit ce paramètre sur la taille de mémoire tampon requise en octets.

[in] bOrder

Valeur booléenne qui spécifie si la table retournée doit être triée. Si ce paramètre a la valeur TRUE, la table est triée dans l’ordre de :

  1. Adresse de destination
  2. Protocole qui a généré l’itinéraire
  3. Stratégie de routage multipath
  4. Adresse du tronçon suivant

Valeur retournée

Si la fonction réussit, la valeur de retour est NO_ERROR (zéro).

Si la fonction échoue, la valeur de retour est l’un des codes d’erreur suivants.

Code de retour Description
ERROR_INSUFFICIENT_BUFFER
La mémoire tampon pointée par le paramètre pIpForwardTable n’est pas assez grande. La taille requise est retournée dans la variable DWORD pointée vers le paramètre pdwSize .
ERROR_INVALID_PARAMETER
Le paramètre pdwSize a la valeur NULL ou GetIpForwardTable ne peut pas écrire dans la mémoire pointée par le paramètre pdwSize .
ERROR_NO_DATA
Aucune donnée n’est disponible. Cette erreur est retournée si aucun itinéraire n’est présent sur l’ordinateur local.
ERROR_NOT_SUPPORTED
Cette fonction n’est pas prise en charge sur le système d’exploitation utilisé sur le système local. Cette erreur est retournée si aucune pile IP n’est installée sur l’ordinateur local.
Autres
Utilisez FormatMessage pour obtenir la chaîne de message de l’erreur retournée.

Notes

Le membre dwForwardProto de la structure MIB_IPFORWARDROW spécifie le protocole ou le mécanisme de routage qui a généré l’itinéraire. Pour obtenir la liste des protocoles et des mécanismes de routage possibles, consultez Identificateurs de protocole.

Les membres dwForwardDest, dwForwardMask et dwForwardNextHop de la structure MIB_IPFORWARDROW représentent une adresse IPv4 dans l’ordre d’octet réseau.

Une adresse IPv4 de 0.0.0.0 dans le membre dwForwardDest de la structure MIB_IPFORWARDROW est considérée comme un itinéraire par défaut. Le MIB_IPFORWARDTABLE peut contenir plusieurs entrées MIB_IPFORWARDROW avec le membre dwForwardDest défini sur 0.0.0.0 quand plusieurs cartes réseau sont installées.

Lorsque dwForwardAge est défini sur INFINITE, l’itinéraire n’est pas supprimé en fonction d’un délai d’expiration

Valeur. Toute autre valeur pour dwForwardAge spécifie le nombre de secondes depuis l’ajout ou la modification de l’itinéraire dans la table de routage réseau.

Sur Windows Server 2003 ou Windows 2000 Server lorsque le service de routage et d’accès à distance (RRAS) est en cours d’exécution, les entrées MIB_IPFORWARDROW retournées ont les membres dwForwardType et dwForwardAge définis sur zéro.

Sur Windows Vista et Windows Server 2008, la métrique d’itinéraire spécifiée dans le membre dwForwardMetric1 de la structure MIB_IPFORWARDROW représente une combinaison de la métrique d’itinéraire ajoutée à la métrique d’interface spécifiée dans le membre Métrique de la structure MIB_IPINTERFACE_ROW de l’interface associée. Par conséquent, le membre dwForwardMetric1 de la structure MIB_IPFORWARDROW doit être égal ou supérieur au membre Metric de la structure MIB_IPINTERFACE_ROW associée. Si une application souhaite définir la métrique d’itinéraire sur 0 sur Windows Vista et Windows Server 2008, le membre dwForwardMetric1 de la structure MIB_IPFORWARDROW doit être défini sur la valeur de la métrique d’interface spécifiée dans le membre Métrique de la structure MIB_IPINTERFACE_ROW associée. Une application peut récupérer la métrique d’interface en appelant la fonction GetIpInterfaceEntry .

Un certain nombre de membres des entrées de structure MIB_IPFORWARDROW retournées par GetIpForwardTable ne sont actuellement pas utilisés par le routage IPv4. Ces membres incluent dwForwardPolicy, dwForwardNextHopAS, dwForwardMetric2, dwForwardMetric3, dwForwardMetric4 et dwForwardMetric5.

Exemples

L’exemple suivant récupère la table de routage IP, puis imprime des champs pour chaque itinéraire de la table.

// 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;
    }

}


Spécifications

   
Client minimal pris en charge Windows 2000 Professionnel [applications de bureau uniquement]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau uniquement]
Plateforme cible Windows
En-tête iphlpapi.h
Bibliothèque Iphlpapi.lib
DLL Iphlpapi.dll

Voir aussi

CreateIpForwardEntry

DeleteIpForwardEntry

GetIpInterfaceEntry

Informations de référence sur les fonctions d’assistance IP

Page de démarrage de l’assistance IP

MIB_IPFORWARDTABLE

MIB_IPINTERFACE_ROW

Identificateurs de protocole

SetIpForwardEntry