다음을 통해 공유


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 (0)입니다.

함수가 실패하면 반환 값은 다음 오류 코드 중 하나입니다.

반환 코드 설명
ERROR_INSUFFICIENT_BUFFER
pIpForwardTable 매개 변수가 가리키는 버퍼가 충분히 크지 않습니다. 필요한 크기는 pdwSize 매개 변수가 가리키는 DWORD 변수에 반환됩니다.
ERROR_INVALID_PARAMETER
pdwSize 매개 변수가 NULL이거나 GetIpForwardTablepdwSize 매개 변수가 가리키는 메모리에 쓸 수 없습니다.
ERROR_NO_DATA
사용할 수 있는 데이터가 없습니다. 이 오류는 로컬 컴퓨터에 경로가 없는 경우 반환됩니다.
ERROR_NOT_SUPPORTED
이 함수는 로컬 시스템에서 사용 중인 운영 체제에서 지원되지 않습니다. 로컬 컴퓨터에 IP 스택이 설치되어 있지 않으면 이 오류가 반환됩니다.
기타
FormatMessage를 사용하여 반환된 오류에 대한 메시지 문자열을 가져옵니다.

설명

MIB_IPFORWARDROW 구조체의 dwForwardProto 멤버는 경로를 생성한 프로토콜 또는 라우팅 메커니즘을 지정합니다. 가능한 프로토콜 및 라우팅 메커니즘 목록은 프로토콜 식별자를 참조하세요.

MIB_IPFORWARDROW 구조체의 dwForwardDest, dwForwardMaskdwForwardNextHop 멤버는 네트워크 바이트 순서로 IPv4 주소를 나타냅니다.

MIB_IPFORWARDROW 구조체의 dwForwardDest 멤버에 있는 0.0.0.0의 IPv4 주소는 기본 경로로 간주됩니다. MIB_IPFORWARDTABLE여러 네트워크 어댑터가 설치된 경우 dwForwardDest 멤버가 0.0.0.0으로 설정된 여러 MIB_IPFORWARDROW 항목을 포함할 수 있습니다.

dwForwardAgeINFINITE로 설정하면 시간 제한에 따라 경로가 제거되지 않습니다.

값입니다. dwForwardAge에 대한 다른 값은 경로가 네트워크 라우팅 테이블에서 추가되거나 수정된 이후의 시간(초)을 지정합니다.

RRAS(라우팅 및 원격 액세스 서비스)가 실행 중인 Windows Server 2003 또는 Windows 2000 Server에서 반환된 MIB_IPFORWARDROW 항목에는 dwForwardTypedwForwardAge 멤버가 0으로 설정됩니다.

Windows Vista 및 Windows Server 2008에서 MIB_IPFORWARDROW 구조체의 dwForwardMetric1 멤버에 지정된 경로 메트릭은 연결된 인터페이스의 MIB_IPINTERFACE_ROW구조의메트릭 멤버에 지정된 인터페이스 메트릭에 추가된 경로 메트릭의 조합을 나타냅니다. 따라서 MIB_IPFORWARDROW 구조체의 dwForwardMetric1 멤버는 연결된 MIB_IPINTERFACE_ROW 구조체의 메트릭 멤버보다 크거나 같아야 합니다. 애플리케이션이 Windows Vista 및 Windows Server 2008에서 경로 메트릭을 0으로 설정하려는 경우 MIB_IPFORWARDROW 구조체의 dwForwardMetric1 멤버는 연결된 MIB_IPINTERFACE_ROW 구조체의 메트릭 멤버에 지정된 인터페이스 메트릭 값과 동일하게 설정되어야 합니다. 애플리케이션은 GetIpInterfaceEntry 함수를 호출하여 인터페이스 메트릭을 검색할 수 있습니다.

GetIpForwardTable에서 반환된 MIB_IPFORWARDROW 구조체 항목의 멤버 수는 현재 IPv4 라우팅에서 사용되지 않습니다. 이러한 멤버에는 dwForwardPolicy, dwForwardNextHopAS, dwForwardMetric2, dwForwardMetric3, dwForwardMetric4dwForwardMetric5가 포함됩니다.

예제

다음 예제에서는 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
헤더 iphlpapi.h
라이브러리 Iphlpapi.lib
DLL Iphlpapi.dll

참고 항목

CreateIpForwardEntry

DeleteIpForwardEntry

GetIpInterfaceEntry

IP 도우미 함수 참조

IP 도우미 시작 페이지

MIB_IPFORWARDTABLE

MIB_IPINTERFACE_ROW

프로토콜 식별자

SetIpForwardEntry