다음을 통해 공유


CreateIpForwardEntry 함수(iphlpapi.h)

CreateIpForwardEntry 함수는 로컬 컴퓨터의 IPv4 라우팅 테이블에 경로를 만듭니다.

구문

IPHLPAPI_DLL_LINKAGE DWORD CreateIpForwardEntry(
  [in] PMIB_IPFORWARDROW pRoute
);

매개 변수

[in] pRoute

새 경로에 대한 정보를 지정하는 MIB_IPFORWARDROW 구조체에 대한 포인터입니다. 호출자는 이 구조체의 모든 멤버에 대한 값을 지정해야 합니다. 호출자는 MIB_IPFORWARDROWdwForwardProto 멤버에 대한 MIB_IPPROTO_NETMGMT 지정해야 합니다.

반환 값

함수가 성공하면 함수가 NO_ERROR (0)를 반환합니다.

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

반환 코드 설명
ERROR_ACCESS_DENIED
액세스가 거부되었습니다. 이 오류는 다음을 포함하는 여러 조건에서 Windows Vista 및 Windows Server 2008에서 반환됩니다. 사용자가 로컬 컴퓨터에 필요한 관리 권한이 없거나 애플리케이션이 기본 제공 관리자(RunAs 관리자)로 향상된 셸에서 실행되고 있지 않습니다.
ERROR_INVALID_PARAMETER
입력 매개 변수가 잘못되었으며 아무 작업도 수행되지 않았습니다. pRoute 매개 변수가 NULL이거나, MIB_IPFORWARDROWdwForwardProto 멤버가 MIB_IPPROTO_NETMGMT 설정되지 않았거나, PMIB_IPFORWARDROW구조체dwForwardMask 멤버가 유효한 IPv4 서브넷 마스크가 아니거나, MIB_IPFORWARDROW 구조체의 다른 멤버 중 하나가 잘못된 경우 이 오류가 반환됩니다.
ERROR_NOT_SUPPORTED
IPv4 전송이 로컬 컴퓨터에 구성되지 않았습니다.
기타
FormatMessage를 사용하여 반환된 오류에 대한 메시지 문자열을 가져옵니다.

설명

경로 매개 변수가 가리키는 MIB_IPFORWARDROW 구조체의 dwForwardProto 멤버를 MIB_IPPROTO_NETMGMT 설정해야 합니다. 그렇지 않으면 CreateIpForwardEntry가 실패합니다. 라우팅 프로토콜 식별자는 지정된 라우팅 프로토콜에 대한 경로 정보를 식별하는 데 사용됩니다. 예를 들어 MIB_IPPROTO_NETMGMT DHCP(동적 호스트 구성 프로토콜), SNMP(Simple Network Management Protocol) 또는 CreateIpForwardEntry, DeleteIpForwardEntry 또는 SetIpForwardEntry 함수 호출과 같은 네트워크 관리를 통해 설정된 IP 라우팅에 대한 경로 정보를 식별하는 데 사용됩니다.

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

Windows Vista 및 Windows Server 2008에서 CreateIpForwardEntry 는 단일 하위 인터페이스가 있는 인터페이스에서만 작동합니다(인터페이스 LUID 및 하위 표면 LUID는 동일). MIB_IPFORWARDROW 구조체의 dwForwardIfIndex 멤버는 인터페이스를 지정합니다.

경로 매개 변수가 가리키는 MIB_IPFORWARDROW 구조체의 여러 멤버는 현재 CreateIpForwardEntry에서 사용되지 않습니다. 이러한 멤버에는 dwForwardPolicy, dwForwardType, dwForwardAge, dwForwardNextHopAS, dwForwardMetric2, dwForwardMetric3, dwForwardMetric4dwForwardMetric5가 포함됩니다.

CreateIpForwardEntry에서 만든 새 경로에는 무한의 dwForwardAge에 대한 기본값이 자동으로 지정됩니다.

IPv4 라우팅 테이블에서 기존 경로를 수정하려면 SetIpForwardEntry 함수를 사용합니다. IPv4 라우팅 테이블을 검색하려면 GetIpForwardTable 함수를 호출합니다.

Windows Vista 이상에서는 Administrators 그룹의 구성원으로 로그온한 사용자만 CreateIpForwardEntry 함수를 호출할 수 있습니다. Administrators 그룹의 멤버가 아닌 사용자가 CreateIpForwardEntry 를 호출하면 함수 호출이 실패하고 ERROR_ACCESS_DENIED 반환됩니다.

Windows Vista 이상에서 UAC(사용자 계정 제어)로 인해 CreateIpForwardEntry 함수가 실패할 수도 있습니다. 이 함수를 포함하는 애플리케이션이 기본 제공 관리자가 아닌 Administrators 그룹의 구성원으로 로그온한 사용자에 의해 실행되는 경우 애플리케이션이 requestedExecutionLevel 이 requireAdministrator로 설정된 매니페스트 파일에 표시되지 않는 한 이 호출은 실패합니다. 애플리케이션에 이 매니페스트 파일이 없는 경우 기본 제공 관리자가 아닌 Administrators 그룹의 구성원으로 로그온한 사용자는 이 함수가 성공하려면 기본 제공 관리자(RunAs 관리자)로 향상된 셸에서 애플리케이션을 실행해야 합니다.

참고 Windows NT 4.0 및 Windows 2000 이상에서 이 함수는 권한 있는 작업을 실행합니다. 이 함수가 성공적으로 실행되려면 호출자가 Administrators 그룹 또는 NetworkConfigurationOperators 그룹의 구성원으로 로그온되어야 합니다.
 

예제

다음 예제에서는 기본 게이트웨이를 NewGateway로 변경하는 방법을 보여 줍니다. GetIpForwardTable을 호출하고 게이트웨이를 변경한 다음 SetIpForwardEntry를 호출하면 경로가 변경되지 않고 새 경로만 추가됩니다. 어떤 이유로 인해 여러 기본 게이트웨이가 있는 경우 이 코드는 해당 게이트웨이를 삭제합니다. 새 게이트웨이는 실행 가능해야 합니다. 그렇지 않으면 TCP/IP는 변경 사항을 무시합니다.

참고 이 코드를 실행하면 IP 라우팅 테이블이 변경되고 네트워크 작업이 실패할 수 있습니다.
 
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "iphlpapi.lib")

int main()
{
    // Declare and initialize variables

    PMIB_IPFORWARDTABLE pIpForwardTable = NULL;
    PMIB_IPFORWARDROW pRow = NULL;
    DWORD dwSize = 0;
    BOOL bOrder = FALSE;
    DWORD dwStatus = 0;
    DWORD NewGateway = 0xDDCCBBAA;  // this is in host order Ip Address AA.BB.CC.DD is DDCCBBAA
    
    unsigned int i;

// Find out how big our buffer needs to be.
    dwStatus = GetIpForwardTable(pIpForwardTable, &dwSize, bOrder);
    if (dwStatus == ERROR_INSUFFICIENT_BUFFER) {
        // Allocate the memory for the table
        if (!(pIpForwardTable = (PMIB_IPFORWARDTABLE) malloc(dwSize))) {
            printf("Malloc failed. Out of memory.\n");
            exit(1);
        }
        // Now get the table.
        dwStatus = GetIpForwardTable(pIpForwardTable, &dwSize, bOrder);
    }

    if (dwStatus != ERROR_SUCCESS) {
        printf("getIpForwardTable failed.\n");
        if (pIpForwardTable)
            free(pIpForwardTable);
        exit(1);
    }
    // Search for the row in the table we want. The default gateway has a destination
    // of 0.0.0.0. Notice that we continue looking through the table, but copy only 
    // one row. This is so that if there happen to be multiple default gateways, we can
    // be sure to delete them all.
    for (i = 0; i < pIpForwardTable->dwNumEntries; i++) {
        if (pIpForwardTable->table[i].dwForwardDest == 0) {
            // We have found the default gateway.
            if (!pRow) {
                // Allocate some memory to store the row in; this is easier than filling
                // in the row structure ourselves, and we can be sure we change only the
                // gateway address.
                pRow = (PMIB_IPFORWARDROW) malloc(sizeof (MIB_IPFORWARDROW));
                if (!pRow) {
                    printf("Malloc failed. Out of memory.\n");
                    exit(1);
                }
                // Copy the row
                memcpy(pRow, &(pIpForwardTable->table[i]),
                       sizeof (MIB_IPFORWARDROW));
            }
            // Delete the old default gateway entry.
            dwStatus = DeleteIpForwardEntry(&(pIpForwardTable->table[i]));

            if (dwStatus != ERROR_SUCCESS) {
                printf("Could not delete old gateway\n");
                exit(1);
            }
        }
    }

    // Set the nexthop field to our new gateway - all the other properties of the route will
    // be the same as they were previously.
    pRow->dwForwardNextHop = NewGateway;

    // Create a new route entry for the default gateway.
    dwStatus = CreateIpForwardEntry(pRow);

    if (dwStatus == NO_ERROR)
        printf("Gateway changed successfully\n");
    else if (dwStatus == ERROR_INVALID_PARAMETER)
        printf("Invalid parameter.\n");
    else
        printf("Error: %d\n", dwStatus);

    // Free resources
    if (pIpForwardTable)
        free(pIpForwardTable);
    if (pRow)
        free(pRow);

    exit(0);
}

요구 사항

   
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
대상 플랫폼 Windows
헤더 iphlpapi.h
라이브러리 Iphlpapi.lib
DLL Iphlpapi.dll

참고 항목

DeleteIpForwardEntry

GetIpForwardTable

GetIpInterfaceEntry

IP 도우미 함수 참조

IP 도우미 시작 페이지

MIB_IPFORWARDROW

SetIpForwardEntry