Поделиться через


Функция 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, таблица сортируется в следующем порядке:

  1. Адрес назначения
  2. Протокол, создающий маршрут
  3. Политика маршрутизации с несколькими маршрутами
  4. Адрес следующего прыжка

Возвращаемое значение

Если функция выполняется успешно, возвращаемое значение будет NO_ERROR (ноль).

Если функция завершается сбоем, возвращаемое значение представляет собой один из следующих кодов ошибок.

Код возврата Описание
ERROR_INSUFFICIENT_BUFFER
Буфер, на который указывает параметр pIpForwardTable, недостаточно велик. Требуемый размер возвращается в переменной DWORD , на которую указывает параметр pdwSize .
ERROR_INVALID_PARAMETER
Параметр pdwSize имеет значение NULL, или GetIpForwardTable не может выполнить запись в память, на которую указывает параметр pdwSize .
ERROR_NO_DATA
Данные недоступны. Эта ошибка возвращается, если на локальном компьютере нет маршрутов.
ERROR_NOT_SUPPORTED
Эта функция не поддерживается в операционной системе, используемой в локальной системе. Эта ошибка возвращается, если на локальном компьютере не установлен стек 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

См. также раздел

CreateIpForwardEntry

DeleteIpForwardEntry

GetIpInterfaceEntry

Справочник по вспомогательным функциям IP

Начальная страница вспомогательного ip-адреса

MIB_IPFORWARDTABLE

MIB_IPINTERFACE_ROW

Идентификаторы протоколов

SetIpForwardEntry