Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Функция 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