用c ++改变我的动态IP地址

时间:2016-03-25 15:05:54

标签: c++ windows ip ip-address tcp-ip

我有一个动态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状态:已启用 IP iniziale DHCP:192.168.1.2 IP结局DHCP(Riservato per uso interno):192.168.1.254

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

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

IP帮助程序功能包括IPReleaseAddressIPRenewAddress来完成此操作。

您需要首先枚举网络适配器,然后将正确的适配器ID传递给函数来执行此操作。您通常使用GetInterfaceInfo

答案 1 :(得分:0)

我知道我的动态IP会改变我的公共IP。但事实并非如此。 要更改我的公共IP地址,我不必更改动态IP,但我需要更改ROUTER IP。 事实上,ISP为任何路由器连接分配一个ip,该连接将是连接的任何设备的公共IP。

(对于公共IP,我指的是您可以在http://www.ipmy.it/中看到的IP地址)

因此,如果我想更改我的公共IP地址,我必须更改我的路由器IP地址。 要更改它,我必须断开并重新连接我的路由器电源,或者我可以通过路由器面板(192.168.1.1)来完成。

因此,唯一的自动解决方案是编写执行该http请求的程序。

我是用c ++使用libCURL写的。

感谢大家的支持。