GetIpForwardTable-Funktion (iphlpapi.h)
Die GetIpForwardTable-Funktion ruft die IPv4-Routingtabelle ab.
Syntax
IPHLPAPI_DLL_LINKAGE DWORD GetIpForwardTable(
[out] PMIB_IPFORWARDTABLE pIpForwardTable,
[in, out] PULONG pdwSize,
[in] BOOL bOrder
);
Parameter
[out] pIpForwardTable
Ein Zeiger auf einen Puffer, der die IPv4-Routingtabelle als MIB_IPFORWARDTABLE-Struktur empfängt.
[in, out] pdwSize
Gibt bei der Eingabe die Größe des Puffers in Bytes an, auf den der pIpForwardTable-Parameter verweist.
Wenn der Puffer bei der Ausgabe nicht groß genug ist, um die zurückgegebene Routingtabelle aufzunehmen, legt die Funktion diesen Parameter auf die erforderliche Puffergröße in Bytes fest.
[in] bOrder
Ein boolescher Wert, der angibt, ob die zurückgegebene Tabelle sortiert werden soll. Wenn dieser Parameter TRUE ist, wird die Tabelle in der Folgenden Reihenfolge sortiert:
- Zieladresse
- Protokoll, das die Route generiert hat
- Routingrichtlinie für mehrere Pfade
- Adresse des nächsten Hops
Rückgabewert
Wenn die Funktion erfolgreich ist, ist der Rückgabewert NO_ERROR (null).
Wenn die Funktion fehlschlägt, ist der Rückgabewert einer der folgenden Fehlercodes.
Rückgabecode | Beschreibung |
---|---|
|
Der Puffer, auf den der pIpForwardTable-Parameter verweist, ist nicht groß genug. Die erforderliche Größe wird in der DWORD-Variablen zurückgegeben, auf die der pdwSize-Parameter verweist. |
|
Der pdwSize-Parameter ist NULL, oder GetIpForwardTable kann nicht in den Arbeitsspeicher schreiben, auf den der pdwSize-Parameter verweist. |
|
Es sind keine Daten verfügbar. Dieser Fehler wird zurückgegeben, wenn auf dem lokalen Computer keine Routen vorhanden sind. |
|
Diese Funktion wird auf dem Betriebssystem, das auf dem lokalen System verwendet wird, nicht unterstützt. Dieser Fehler wird zurückgegeben, wenn auf dem lokalen Computer kein IP-Stapel installiert ist. |
|
Verwenden Sie FormatMessage , um die Nachrichtenzeichenfolge für den zurückgegebenen Fehler abzurufen. |
Hinweise
Das dwForwardProto-Element der MIB_IPFORWARDROW-Struktur gibt das Protokoll oder den Routingmechanismus an, der die Route generiert hat. Eine Liste möglicher Protokolle und Routingmechanismen finden Sie unter Protokollbezeichner .
Die Mitglieder dwForwardDest, dwForwardMask und dwForwardNextHop der MIB_IPFORWARDROW Struktur stellen eine IPv4-Adresse in Netzwerkbytereihenfolge dar.
Eine IPv4-Adresse von 0.0.0.0 im dwForwardDest-Member der MIB_IPFORWARDROW-Struktur wird als Standardroute betrachtet. Die MIB_IPFORWARDTABLE kann mehrere MIB_IPFORWARDROW Einträge enthalten, wobei der dwForwardDest-Member auf 0.0.0.0 festgelegt ist, wenn mehrere Netzwerkadapter installiert sind.
Wenn dwForwardAge auf INFINITE festgelegt ist, wird die Route nicht basierend auf einem Timeout entfernt.
-Wert verwendet wird. Jeder andere Wert für dwForwardAge gibt die Anzahl von Sekunden an, seit die Route in der Netzwerkroutingtabelle hinzugefügt oder geändert wurde.
Unter Windows Server 2003 oder Windows 2000 Server, wenn der Routing- und RAS-Dienst (RRAS) ausgeführt wird, haben die zurückgegebenen MIB_IPFORWARDROW-Einträge die Elemente dwForwardType und dwForwardAge auf 0 festgelegt.
Unter Windows Vista und Windows Server 2008 stellt die Routenmetrik, die im dwForwardMetric1-Member der MIB_IPFORWARDROW-Struktur angegeben ist, eine Kombination der Routenmetrik dar, die der Schnittstellenmetrik hinzugefügt wird, die im Metrikelement der MIB_IPINTERFACE_ROW Struktur der zugeordneten Schnittstelle angegeben ist. Daher sollte das dwForwardMetric1-Element der MIB_IPFORWARDROW-Struktur gleich oder größer als das Metrikelement der zugeordneten MIB_IPINTERFACE_ROW-Struktur sein. Wenn eine Anwendung die Routenmetrik unter Windows Vista und Windows Server 2008 auf 0 festlegen möchte, sollte das dwForwardMetric1-Element der MIB_IPFORWARDROW-Struktur gleich dem Wert der Schnittstellenmetrik festgelegt werden, der im Metrikelement der zugeordneten MIB_IPINTERFACE_ROW-Struktur angegeben ist. Eine Anwendung kann die Schnittstellenmetrik abrufen, indem sie die GetIpInterfaceEntry-Funktion aufruft .
Eine Reihe von Membern der MIB_IPFORWARDROW Struktureinträgen, die von GetIpForwardTable zurückgegeben werden, werden derzeit nicht vom IPv4-Routing verwendet. Zu diesen Membern gehören dwForwardPolicy, dwForwardNextHopAS, dwForwardMetric2, dwForwardMetric3, dwForwardMetric4 und dwForwardMetric5.
Beispiele
Im folgenden Beispiel wird die IP-Routingtabelle abgerufen und dann einige Felder für jede Route in der Tabelle ausgegeben.
// 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;
}
}
Anforderungen
Unterstützte Mindestversion (Client) | Windows 2000 Professional [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows 2000 Server [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | iphlpapi.h |
Bibliothek | Iphlpapi.lib |
DLL | Iphlpapi.dll |