首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC++

不重啟 Windows 修改 IP 位址的三種實作方法

     編輯:VC++

方法一:未公開 API DhcpNotifyConfigChange (最優雅)

Windows 介面修改 IP 即時生效,追蹤發現 netcfgx.dll 呼叫 dhcpcsvc.dll 內部函式 DhcpNotifyConfigChange。步驟:

  1. 取得介面卡名稱 (GUID):非顯示名稱,如 {66156DC3-44A4-434C-B8A9-0E5DB4B3EEAD}。可用 GetAdaptersInfo (IP Helper API) 或掃描註冊表 HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\000n\Ndi\Interfaces 取得。
  2. 寫入註冊表:HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{GUID} 下設定 IPAddress、SubnetMask、DefaultGateway (REG_MULTI_SZ 結尾雙 null)。
  3. 呼叫通知函式:

typedef BOOL (WINAPI *PFN_DHCPNOTIFY)(LPWSTR, LPWSTR, BOOL, DWORD, DWORD, DWORD, int);

BOOL NotifyIpChange(LPCTSTR adapter, int index, LPCTSTR ip, LPCTSTR mask)
{
    HMODULE hDll = LoadLibrary(_T("dhcpcsvc.dll"));
    if (!hDll) return FALSE;
    PFN_DHCPNOTIFY pFn = (PFN_DHCPNOTIFY)GetProcAddress(hDll, "DhcpNotifyConfigChange");
    if (!pFn) { FreeLibrary(hDll); return FALSE; }

    WCHAR wAdapter[256]; MultiByteToWideChar(CP_ACP, 0, adapter, -1, wAdapter, 256);
    BOOL ret = pFn(NULL, wAdapter, TRUE, index, inet_addr(ip), inet_addr(mask), 0) == ERROR_SUCCESS;
    FreeLibrary(hDll);
    return ret;
}

方法二:修改註冊表 + 程式化重啟網卡 (最標準)

註冊表關鍵位置 (四處需同步):

  • HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{GUID} (主設定)
  • HKLM\SYSTEM\CurrentControlSet\Services\{GUID}\Parameters\Tcpip (服務層)
  • ControlSet001 同步 (CurrentControlSet 別名)

關鍵步驟:程式化重啟網卡 (對應 Linux ifconfig down/up)。使用 DDK SetupAPI (SetupDiCallClassInstaller 配合 DIF_PROPERTYCHANGE / DICS_DISABLE → DICS_ENABLE) 禁用再啟用裝置。完整代碼較長,參考附件。

方法三:IP Helper API 實現一卡多 IP 切換 (最輕量)

TCP/IP 允許單 NIC 綁定多 IP (同一 MAC 對應多 IP)。流程:

  1. AddIPAddress 新增目標 IP。
  2. DeleteIPAddress 刪除舊 IP (取得 NTE Context 後)。
  3. 即時生效,無需重啟網卡,適合頻繁切換場景。

// 範例:新增 IP
DWORD dwRet = AddIPAddress(inet_addr("192.168.1.100"), inet_addr("255.255.255.0"), nIfIndex, &nNteContext, &nNteInstance);
// 刪除舊 IP
DeleteIPAddress(oldNteContext);

比較總結

方法優點缺點適用場景
DhcpNotifyConfigChange模擬介面操作、單次生效、支援 DHCP 狀態切換未公開 API、版本相容風險需完整模擬 GUI 行為
註冊表 + 重啟網卡標準、穩定、持久化需 SetupAPI、重啟網卡延遲較大系統管理工具、永久修改
AddIPAddress / DeleteIPAddress極快、無相依、支援多 IP 共存非永久 (重啟失效)、舊 IP 可能殘留連線臨時切換、測試、多 IP 管理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved