Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Функция SetIpForwardEntry изменяет существующий маршрут в таблице маршрутизации IPv4 локального компьютера.
Синтаксис
IPHLPAPI_DLL_LINKAGE DWORD SetIpForwardEntry(
[in] PMIB_IPFORWARDROW pRoute
);
Параметры
[in] pRoute
Указатель на структуру MIB_IPFORWARDROW , указывающую новые сведения для существующего маршрута. Вызывающий объект должен указать MIB_IPPROTO_NETMGMT для члена dwForwardProto этой структуры. Вызывающий объект также должен указать значения для элементов dwForwardIfIndex, dwForwardDest, dwForwardMask, dwForwardNextHop и dwForwardPolicy структуры.
Возвращаемое значение
Если функция выполняется успешно, возвращаемое значение будет NO_ERROR.
Если функция завершается сбоем, возвращаемое значение представляет собой один из следующих кодов ошибок.
| Код возврата | Описание |
|---|---|
|
Отказано в доступе". Эта ошибка возвращается в Windows Vista и Windows Server 2008 при следующих условиях: у пользователя отсутствуют необходимые права администратора на локальном компьютере или приложение не работает в расширенной оболочке в качестве встроенного администратора (администратор запуска от имени). |
|
Системе не удается найти указанный файл. Эта ошибка возвращается в Windows Vista и более поздних версиях, если не удалось найти сетевой интерфейс, указанный членом dwForwardIfIndexструктуры MIB_IPFORWARDROW , на которую указывает параметр pRoute . |
|
Параметр pRoute имеет значение NULL, или SetIpForwardEntry не может считывать данные из памяти, на которую указывает pRoute, или один из элементов структуры MIB_IPFORWARDROW является недопустимым. |
|
Элемент не найден. Эта ошибка возвращается в Windows Vista и более поздних версиях, когда функция DeleteIpForwardEntry , а затем функция SetIpForwardEntry вызываются для той же записи таблицы маршрутов IPv4. |
|
Запрос не поддерживается. Это значение возвращается, если транспорт IPv4 не настроен на локальном компьютере. Эта ошибка также возвращается в Windows Server 2003 и более ранних версиях, если на локальном компьютере не настроен стек TCP/IP. |
|
Используйте FormatMessage , чтобы получить строку сообщения для возвращенной ошибки. |
Комментарии
Члену dwForwardProtoструктуры MIB_IPFORWARDROW, на которую указывает параметр маршрута, необходимо задать значение MIB_IPPROTO_NETMGMT в противном случае SetIpForwardEntry завершится ошибкой. Идентификаторы протокола маршрутизации используются для определения сведений о маршрутах для указанного протокола маршрутизации. Например, MIB_IPPROTO_NETMGMT используется для определения сведений о маршруте для IP-маршрутизации, заданной с помощью управления сетью, например протокола DHCP, ПРОТОКОЛА SNMP или путем вызовов функций CreateIpForwardEntry, DeleteIpForwardEntry или SetIpForwardEntry .
В Windows Vista и Windows Server 2008 метрика маршрута, указанная в элементе dwForwardMetric1 структуры MIB_IPFORWARDROW , на которую указывает параметр pRoute , представляет собой сочетание метрики маршрута, добавленной в метрику интерфейса, указанную в элементе MetricMIB_IPINTERFACE_ROW структуры связанного интерфейса. Таким образом, элемент dwForwardMetric1 структуры MIB_IPFORWARDROW должен быть равен или больше элемента Metric связанной MIB_IPINTERFACE_ROW структуры. Если приложение хочет задать для метрики маршрута значение 0, то элемент dwForwardMetric1 структуры MIB_IPFORWARDROW должен быть равен значению метрики интерфейса, указанной в элементе Метрика связанной структуры MIB_IPINTERFACE_ROW . Приложение может получить метрику интерфейса, вызвав функцию GetIpInterfaceEntry .
В Windows Vista и Windows Server 2008 функция SetIpForwardEntry работает только с интерфейсами с одним вложенным интерфейсом (где интерфейс LUID и подзаверх LUID совпадают). Элемент dwForwardIfIndex структуры MIB_IPFORWARDROW указывает интерфейс .
Элемент dwForwardAge , на MIB_IPFORWARDROW структуру, на которую указывает параметр маршрута , в настоящее время не используется SetIpForwardEntry. Член dwForwardAge используется только в том случае, если служба маршрутизации и удаленного доступа (RRAS) запущена, и только для маршрутов типа MIB_IPPROTO_NETMGMT , как определено на странице справочника по идентификаторам протоколов . Если для dwForwardAge задано значение INFINITE, маршрут не будет удален в зависимости от времени ожидания.
альфа. Любое другое значение dwForwardAge указывает время в секундах, пока стек TCP/IP удалит маршрут из таблицы маршрутизации сети.
Маршрут, измененный SetIpForwardEntry , будет автоматически иметь значение по умолчанию для dwForwardAge INFINITE.
Некоторые элементы структуры MIB_IPFORWARDROW , на которые указывает параметр маршрута , в настоящее время не используются в SetIpForwardEntry. К этим элементам относятся dwForwardPolicy, dwForwardType, dwForwardAge, dwForwardNextHopAS, dwForwardMetric1, dwForwardMetric2, dwForwardMetric3, dwForwardMetric4 и dwForwardMetric5.
Чтобы создать новый маршрут в таблице IP-маршрутизации, используйте функцию CreateIpForwardEntry . Чтобы получить таблицу IP-маршрутизации, вызовите функцию GetIpForwardTable .
В Windows Vista и более поздних версиях функция SetIpForwardEntry может вызываться только пользователем, вошедшего в систему как участник группы "Администраторы". Если метод SetIpForwardEntry вызывается пользователем, не включаемым в группу Администраторы, вызов функции завершится ошибкой и ERROR_ACCESS_DENIED возвращается.
Эта функция также может завершиться ошибкой из-за контроля учетных записей (UAC) в Windows Vista и более поздних версиях. Если приложение, содержащее эту функцию, выполняется пользователем, вошедшего в систему как участник группы администраторов, отличный от встроенного администратора, этот вызов завершится ошибкой, если приложение не было отмечено в файле манифеста параметром requestedExecutionLevel , для которого задано значение requireAdministrator. Если в приложении отсутствует этот файл манифеста, пользователь, вошедший в группу администраторов, отличный от встроенного администратора, должен выполнять приложение в расширенной оболочке в качестве встроенного администратора (администратора запуска от имени) для успешного выполнения этой функции.
Примеры
В следующем примере показано, как изменить шлюз по умолчанию на NewGateway. Простое вызов GetIpForwardTable, изменение шлюза, а затем вызов SetIpForwardEntry не изменит маршрут, а просто добавит новый. Если по какой-либо причине существует несколько шлюзов по умолчанию, этот код удалит их. Обратите внимание, что новый шлюз должен быть жизнеспособным; В противном случае TCP/IP пропустит это изменение.
Windows Vista и более поздних версий: При вызове функции DeleteIpForwardEntry и SetIpForwardEntry для одной и той же записи таблицы маршрутов в Windows Vista и более поздних версиях возвращается 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 |
| Header | iphlpapi.h |
| Библиотека | Iphlpapi.lib |
| DLL | Iphlpapi.dll |
См. также раздел
Справочник по вспомогательным функциям IP