Почему DeleteIPAddress завершается ошибкой при удалении IP-адреса адаптера по умолчанию?
Я пытаюсь написать программу, которая будет переключать IP-адрес выбранного адаптера по команде.
Для этого я использую функцию GetAdaptersInfo() для получения индекса адаптера и его контекста IP, а затем использую его для удаления текущего IP (через DeleteIPAddress(context)).
После этого новый IP-адрес будет вставлен через AddIPAddress().
Проблема заключается в том, что вызов функции DeleteIPAddress завершается неудачно при попытке удалить IP-адрес "по умолчанию" (тот, который не установлен AddIPAddress()), и вызов AddIPAddress перед удалением старого IP-адреса оставляет адаптеру два разных одновременных IP-адреса.
Функция DeleteIPAddress завершается с ошибкой 31 (подключенное к системе устройство не работает).
Есть ли другой способ успешно изменить IP-адрес на адаптере? Действительно ли DeleteIPAddress можно использовать без получения контекста от AddIPAddress?
1 ответ
Говорят, DeleteIPAddress удаляет адрес, ранее добавленный AddIPAddress:-) Я провел некоторые исследования по интересам и...
Есть недокументированные SetAdapterIPAddress
функция.
DWORD SetAdapterIpAddress( char *pszAdapGUID,
DWORD dwDHCP,
DWORD dwIP,
DWORD dwMask,
DWORD dwGateway );
Может работать или нет:-) Также есть интерфейс WMI. Смотрите для Win32_NetworkAdapterConfiguration
учебный класс. И есть записи в реестре Windows для IP-адреса NIC...
Я думаю, сложность заключается в наличии в Windows многих "внутренних" конфигурационных агентов (DHCP, другие...), и все они являются внутренней частью ОС, а затем, когда они манипулируют IP-адресом, другие манипуляции вне элемента управления могут сломаться. работая из них. Также есть возможность назначить статический IP-адрес в Реестре, и он также не должен быть взломан. И тогда у вас действительно есть DeleteIPAddress, который вы ранее добавили... Я думаю, он предназначен для ваших собственных агентов динамической конфигурации...
Если вас не устраивает работа других агентов, вы должны отключить их (вместо того, чтобы манипулировать IP-адресом из-под контроля)... Или управлять им с помощью какого-то определенного API... Или установить статический IP...