使用C++更改我的动态IP地址

6
我有一个动态IP地址,实际上我可以从我的路由器页面(http://192.168.1.1)点击释放然后续约来更改它。
我可以通过curl向http://192.168.1.1页面发出HTTP请求,但这只解决了使用该路由器的计算机的问题。
因此,我想知道是否有一种方法可以通过c ++更新我的IP地址,而不通过路由器页面(192.168.1.1)。
我也尝试过命令行,但没有成功的结果。我尝试的代码如下:
ipconfig /release

ipconfig /renew

我也尝试过这段代码:

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include "stdafx.h"
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <iostream> 

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

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x)) 
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

// Before calling IpReleaseAddress and IpRenewAddress we use
// GetInterfaceInfo to retrieve a handle to the adapter

void __cdecl main()
{
    ULONG ulOutBufLen = 0;
    DWORD dwRetVal = 0;
    PIP_INTERFACE_INFO pInfo;

    pInfo = (IP_INTERFACE_INFO *)MALLOC(sizeof(IP_INTERFACE_INFO));

    // Make an initial call to GetInterfaceInfo to get
    // the necessary size into the ulOutBufLen variable
    if (GetInterfaceInfo(pInfo, &ulOutBufLen) == ERROR_INSUFFICIENT_BUFFER) {
        FREE(pInfo);
        pInfo = (IP_INTERFACE_INFO *)MALLOC(ulOutBufLen);
    }

    // Make a second call to GetInterfaceInfo to get the
    // actual data we want
    if ((dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen)) == NO_ERROR) {
        printf("\tAdapter Name: %ws\n", pInfo->Adapter[0].Name);
        printf("\tAdapter Index: %ld\n", pInfo->Adapter[0].Index);
        printf("\tNum Adapters: %ld\n", pInfo->NumAdapters);
    }
    else if (dwRetVal == ERROR_NO_DATA) {
        printf("There are no network adapters with IPv4 enabled on the local system\n");
        return;
    }
    else {
        LPVOID lpMsgBuf;
        printf("GetInterfaceInfo failed.\n");

        if (FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER |
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            dwRetVal,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
            (LPTSTR)&lpMsgBuf,
            0,
            NULL)) {
            printf("\tError: %s", lpMsgBuf);
        }
        LocalFree(lpMsgBuf);
        return;
    }

    // Call IpReleaseAddress and IpRenewAddress to release and renew
    // the IP address on the first network adapter returned 
    // by the call to GetInterfaceInfo.
    if ((dwRetVal = IpReleaseAddress(&pInfo->Adapter[0])) == NO_ERROR) {
        printf("IP release succeeded.\n");
    }
    else {
        printf("IP release failed: %ld\n", dwRetVal);
    }

    if ((dwRetVal = IpRenewAddress(&pInfo->Adapter[0])) == NO_ERROR) {
        printf("IP renew succeeded.\n");
    }
    else {
        printf("IP renew failed: %ld\n", dwRetVal);
    }

    // Free memory for IP_INTERFACE_INFO 
    if (pInfo != NULL) {
        FREE(pInfo);
    }
    std::cout << ("\n Processo terminato\n");
    std::system("PAUSE");

    return;
}

我已经启用了DHCP服务器,具体数值如下:

DHCP服务状态

DHCP状态:已启用

DHCP初始IP地址:192.168.1.2

DHCP结束IP地址(保留供内部使用):192.168.1.254

我需要在Windows XP和Windows 7平台上运行我的程序。

谢谢您的帮助。


我猜你的路由器运行着一个DHCP服务器。在这种情况下,你可以发送一个DHCPRELEASE数据包并请求一个新的IP地址。 - Rocki
我认为我的路由器有一个DHCP服务器,事实上我可以通过路由器页面更改我的IP地址。 有没有办法使用C++发送DHCPRELEASE - Carme
如果您只想更改网络接口上的IP,请从阅读此内容开始:http://stackoverflow.com/questions/1070351/getadaptersinfo-and-getadaptersaddressess-bufferlength-param,然后继续查看MSDN https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa366028%28v=vs.85%29.aspx 和 https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa366309%28v=vs.85%29.aspx。 - user2807083
为什么要使用C++?你可以使用ipconfig /release [<Adapter>]ipconfig /release6 [<Adapter>] https://technet.microsoft.com/en-us/library/dd197434.aspx 如果你真的想用C++来做,那就使用WinApi IpReleaseAddress https://msdn.microsoft.com/en-us/library/windows/desktop/aa366056%28v=vs.85%29.aspx - Rocki
我尝试使用 ipconfig /releaseipconfig /renew,但它们不起作用。现在我将尝试学习函数 IPReleaseAddres 和 IPRenewAddres。希望这不会太难 :D - Carme
显示剩余2条评论
2个回答

4

我尝试了你建议的链接中找到的示例代码。这花费了我一些时间,因为我需要安装Visual Basic。 无论如何,程序成功终止,但IP并未更改。你能告诉我原因吗? 我将在第一篇帖子中添加我已编译的代码,因为它太长了,不能放在评论中。 - Carme
@Carme:DHCP服务器可以自由分配相同的IP地址给新租约。也许您可以更改硬件地址(MAC欺骗)并欺骗DHCP服务器为您分配另一个空闲的IP地址。但是,由于可以通过路由器Web界面实现此操作,因此您可以使用C++向路由器发送正确的HTTP数据包序列。 - Rocki
我尝试更改MAC地址,虽然我获得了一个新的IPv4地址,但并没有获得一个新的公共IP地址。 - Carme
@Carme 好的,你想要一个新的公共IP地址?你路由器中的DHCP服务器只分配本地网络中的IP地址。正如我所说,你可以像使用Web浏览器一样向路由器发送HTTP数据包,它会为你完成这项工作。 - Rocki

1
我曾以为更改我的动态IP地址也会更改我的公共IP地址。但事实并非如此。 要更改我的公共IP地址,我不需要更改动态IP地址,而是需要更改路由器IP地址。 事实上,ISP为任何路由器连接分配一个IP地址,这将是任何连接设备的公共IP地址。
(对于公共IP地址,我指的是您可以在http://www.ipmy.it/中看到的IP地址)
因此,如果我想更改我的公共IP地址,我必须更改我的路由器IP地址。 要更改它,我必须断开并重新连接我的路由器电源,或者我可以通过路由器面板(192.168.1.1)进行更改。
因此,唯一的自动解决方案是编写执行该http请求的程序。 我使用libCURL在c++中编写了它。
感谢大家的支持。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接