Функция GetIpForwardTable (iphlpapi.h)
Функция GetIpForwardTable извлекает таблицу маршрутизации IPv4.
Синтаксис
IPHLPAPI_DLL_LINKAGE DWORD GetIpForwardTable(
[out] PMIB_IPFORWARDTABLE pIpForwardTable,
[in, out] PULONG pdwSize,
[in] BOOL bOrder
);
Параметры
[out] pIpForwardTable
Указатель на буфер, который получает таблицу маршрутизации IPv4 в качестве структуры MIB_IPFORWARDTABLE .
[in, out] pdwSize
На входных данных указывает размер буфера в байтах, на который указывает параметр pIpForwardTable .
На выходных данных, если буфер недостаточно велик для хранения возвращаемой таблицы маршрутизации, функция устанавливает этот параметр равным требуемому размеру буфера в байтах.
[in] bOrder
Логическое значение, указывающее, следует ли отсортировать возвращаемую таблицу. Если этот параметр имеет значение TRUE, таблица сортируется в следующем порядке:
- Адрес назначения
- Протокол, создающий маршрут
- Политика маршрутизации с несколькими маршрутами
- Адрес следующего прыжка
Возвращаемое значение
Если функция выполняется успешно, возвращаемое значение будет NO_ERROR (ноль).
Если функция завершается сбоем, возвращаемое значение представляет собой один из следующих кодов ошибок.
Код возврата | Описание |
---|---|
|
Буфер, на который указывает параметр pIpForwardTable, недостаточно велик. Требуемый размер возвращается в переменной DWORD , на которую указывает параметр pdwSize . |
|
Параметр pdwSize имеет значение NULL, или GetIpForwardTable не может выполнить запись в память, на которую указывает параметр pdwSize . |
|
Данные недоступны. Эта ошибка возвращается, если на локальном компьютере нет маршрутов. |
|
Эта функция не поддерживается в операционной системе, используемой в локальной системе. Эта ошибка возвращается, если на локальном компьютере не установлен стек IP-адресов. |
|
Используйте FormatMessage , чтобы получить строку сообщения для возвращенной ошибки. |
Комментарии
Элемент dwForwardProto структуры MIB_IPFORWARDROW указывает протокол или механизм маршрутизации, создающий маршрут. Список возможных протоколов и механизмов маршрутизации см. в разделе Идентификаторы протоколов.
Элементы dwForwardDest, dwForwardMask и dwForwardNextHop структуры MIB_IPFORWARDROW представляют IPv4-адрес в порядке сетевых байтов.
IPv4-адрес 0.0.0.0 в элементе dwForwardDestструктуры MIB_IPFORWARDROW считается маршрутом по умолчанию. Если установлено несколько сетевых адаптеров, MIB_IPFORWARDTABLE может содержать несколько записей MIB_IPFORWARDROW с элементом dwForwardDest, равным 0.0.0.0.
Если для dwForwardAge задано значение INFINITE, маршрут не будет удален в зависимости от времени ожидания.
альфа. Любое другое значение dwForwardAge указывает количество секунд с момента добавления или изменения маршрута в таблице сетевой маршрутизации.
В Windows Server 2003 или Windows 2000 Server, когда запущена служба маршрутизации и удаленного доступа (RRAS), возвращаемые записи MIB_IPFORWARDROW имеют равные нулю элементы dwForwardType и dwForwardAge .
В Windows Vista и Windows Server 2008 метрика маршрута, указанная в элементе dwForwardMetric1 структуры MIB_IPFORWARDROW , представляет собой сочетание метрики маршрута, добавленной в метрику интерфейса, указанную в элементе Метрикиструктуры MIB_IPINTERFACE_ROW связанного интерфейса. Таким образом, элемент dwForwardMetric1 структуры MIB_IPFORWARDROW должен быть равен или больше элемента Metric связанной MIB_IPINTERFACE_ROW структуры. Если приложение хочет задать для метрики маршрута значение 0 в Windows Vista и Windows Server 2008, то элемент dwForwardMetric1 структуры MIB_IPFORWARDROW должен быть равен значению метрики интерфейса, указанной в элементе Metric связанной структуры MIB_IPINTERFACE_ROW . Приложение может получить метрику интерфейса, вызвав функцию GetIpInterfaceEntry .
Несколько элементов записей структуры MIB_IPFORWARDROW , возвращаемых Командлетом GetIpForwardTable , в настоящее время не используются маршрутизацией IPv4. К этим элементам относятся dwForwardPolicy, dwForwardNextHopAS, dwForwardMetric2, dwForwardMetric3, dwForwardMetric4 и dwForwardMetric5.
Примеры
В следующем примере извлекается таблица IP-маршрутизации, а затем выводится несколько полей для каждого маршрута в таблице.
// 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;
}
}
Требования
Минимальная версия клиента | Windows 2000 Professional [только классические приложения] |
Минимальная версия сервера | Windows 2000 Server [только классические приложения] |
Целевая платформа | Windows |
Header | iphlpapi.h |
Библиотека | Iphlpapi.lib |
DLL | Iphlpapi.dll |
См. также раздел
Справочник по вспомогательным функциям IP