다음을 통해 공유


SetIpForwardEntry 함수(iphlpapi.h)

SetIpForwardEntry 함수는 로컬 컴퓨터의 IPv4 라우팅 테이블에서 기존 경로를 수정합니다.

구문

IPHLPAPI_DLL_LINKAGE DWORD SetIpForwardEntry(
  [in] PMIB_IPFORWARDROW pRoute
);

매개 변수

[in] pRoute

기존 경로에 대한 새 정보를 지정하는 MIB_IPFORWARDROW 구조체에 대한 포인터입니다. 호출자는 이 구조체의 dwForwardProto 멤버에 대한 MIB_IPPROTO_NETMGMT 지정해야 합니다. 호출자는 구조체의 dwForwardIfIndex, dwForwardDest, dwForwardMask, dwForwardNextHopdwForwardPolicy 멤버에 대한 값도 지정해야 합니다.

반환 값

함수가 성공하면 반환 값이 NO_ERROR.

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

반환 코드 설명
ERROR_ACCESS_DENIED
액세스가 거부되었습니다. 이 오류는 다음을 포함하는 여러 조건에서 Windows Vista 및 Windows Server 2008에서 반환됩니다. 사용자가 로컬 컴퓨터에 필요한 관리 권한이 없거나 애플리케이션이 기본 제공 관리자(RunAs 관리자)로 향상된 셸에서 실행되고 있지 않습니다.
ERROR_FILE_NOT_FOUND
시스템은 지정된 파일을 찾을 수 없습니다. 이 오류는 Windows Vista에서 반환되며 나중에 pRoute 매개 변수가 가리키는 MIB_IPFORWARDROW 구조체의 dwForwardIfIndex 멤버가 지정한 네트워크 인터페이스를 찾을 수 없는 경우 반환됩니다.
ERROR_INVALID_PARAMETER
pRoute 매개 변수가 NULL이거나 SetIpForwardEntrypRoute가 가리키는 메모리에서 읽을 수 없거나 MIB_IPFORWARDROW 구조체의 멤버 중 하나가 잘못되었습니다.
ERROR_NOT_FOUND
요소를 찾을 수 없습니다. 동일한 IPv4 경로 테이블 항목에 대해 DeleteIpForwardEntry 함수와 SetIpForwardEntry 함수가 호출되면 Windows Vista 이상에서 오류가 반환됩니다.
ERROR_NOT_SUPPORTED
요청이 지원되지 않습니다. IPv4 전송이 로컬 컴퓨터에 구성되지 않은 경우 이 값이 반환됩니다. 이 오류는 로컬 컴퓨터에 TCP/IP 스택이 구성되지 않은 경우 Windows Server 2003 및 이전 버전에서도 반환됩니다.
기타
FormatMessage를 사용하여 반환된 오류에 대한 메시지 문자열을 가져옵니다.

설명

경로 매개 변수가 가리키는 MIB_IPFORWARDROW 구조체의 dwForwardProto 멤버를 MIB_IPPROTO_NETMGMT 설정해야 합니다. 그렇지 않으면 SetIpForwardEntry가 실패합니다. 라우팅 프로토콜 식별자는 지정된 라우팅 프로토콜에 대한 경로 정보를 식별하는 데 사용됩니다. 예를 들어 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에서 SetIpForwardEntry 함수는 단일 하위 인터페이스가 있는 인터페이스에서만 작동합니다(인터페이스 LUID 및 하위 표면 LUID는 동일함). MIB_IPFORWARDROW 구조체의 dwForwardIfIndex 멤버는 인터페이스를 지정합니다.

경로 매개 변수가 가리키는 MIB_IPFORWARDROW 구조체의 dwForwardAge 멤버는 현재 SetIpForwardEntry에서 사용되지 않습니다. dwForwardAge 멤버는 RRAS(라우팅 및 원격 액세스 서비스)가 실행 중인 경우에만 사용되며 프로토콜 식별자 참조 페이지에 정의된 대로 MIB_IPPROTO_NETMGMT 형식의 경로에만 사용됩니다. dwForwardAgeINFINITE로 설정하면 시간 제한에 따라 경로가 제거되지 않습니다.

값입니다. dwForwardAge에 대한 다른 값은 TCP/IP 스택이 네트워크 라우팅 테이블에서 경로를 제거할 때까지의 시간(초)을 지정합니다.

SetIpForwardEntry에서 수정한 경로에는 INFINITE의 dwForwardAge에 대한 기본값이 자동으로 지정됩니다.

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

IP 라우팅 테이블에서 새 경로를 만들려면 CreateIpForwardEntry 함수를 사용합니다. IP 라우팅 테이블을 검색하려면 GetIpForwardTable 함수를 호출합니다.

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

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

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

예제

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

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

Windows Vista 이상: Windows Vista 이상에서 동일한 경로 테이블 항목에 대해 DeleteIpForwardEntry 함수와 SetIpForwardEntry 함수가 호출되면 ERROR_NOT_FOUND 반환됩니다. Windows Vista 이상에서 이 예제를 복제하는 적절한 방법은 CreateIpForwardEntry 함수를 사용하여 새 경로 테이블 항목을 만든 다음 DeleteIpForwardEntry 함수를 호출하여 이전 경로 테이블 항목을 삭제하는 것입니다.

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

// #ifndef WIN32_LEAN_AND_MEAN
// #define WIN32_LEAN_AND_MEAN
// #endif

// #pragma warning(push)
// #pragma warning(disable: 4127)

// #include <windows.h>

#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>

#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 SetIfForwardEntry */

    PMIB_IPFORWARDTABLE pIpForwardTable = NULL;
    PMIB_IPFORWARDROW pRow = NULL;
    DWORD dwSize = 0;
    BOOL bOrder = FALSE;
    DWORD dwStatus = 0;
    DWORD NewGateway = 0xDDBBCCAA;      // this is in host order Ip Address AA.BB.CC.DD is DDCCBBAA
    DWORD 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
        pIpForwardTable = (PMIB_IPFORWARDTABLE) malloc(dwSize);
        if (pIpForwardTable == NULL) {
            printf("Unable to allocate memory for the IPFORWARDTALE\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 to 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 = SetIpForwardEntry(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);
}


요구 사항

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

추가 정보

CreateIpForwardEntry

DeleteIpForwardEntry

GetIpForwardTable

GetIpInterfaceEntry

IP 도우미 함수 참조

IP 도우미 시작 페이지

MIB_IPFORWARDROW

MIB_IPINTERFACE_ROW