2016-03-25 12 views
6

私は動的IPアドレスを持っています。ルータページ(http://192.168.1.1)からリリースをクリックして更新することができます。私の動的IPアドレスをC++で変更してください

私はhttp:// http://192.168.1.1ページにcurlでhttpリクエストを作成できましたが、これはそのルータを使用しているコンピュータでのみ問題を解決します。

私はルータページ(192.168.1.1)を通過せずに私のIPをC++で更新する方法があるかどうか知りたいです。

私はまた、肯定的な結果なしでコマンドラインから試しました。私が試した コードは以下の通りです:

#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; 
} 

IましたDHCPサーバーの有効聖霊降臨祭の次の値: DHCPサービス状態 DHCP州立

ipconfig /release 

ipconfig /renew 

は、私もこのコードを試してみました:有効 IP iniziale DHCP:192.168.1.2 IPフィナーレDHCP(RiservatoあたりUSO INTERNO):192.168.1.254

私はWindows XPとWindows 7のPL上の私のプログラムを実行する必要がありますatform。

感謝のあなたの助けのために

+0

あなたのルータはDHCPサーバを稼働していると思います。この場合、 'DHCPRELEASE'パケットを送り、新しいIPアドレスを要求することができます。 – Rocki

+0

私のルーターはDHCPサーバーを持っていると思うのですが、私はルーターのページで私のIPを変更できます。 C++を使って 'DHCPRELEASE'を送る方法はありますか? – Carme

+0

ネットワークインターフェイスで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

答えて

4

IPヘルパー機能は、まさにこれを行うにはIPReleaseAddressIPRenewAddressが含まれます。

ネットワークアダプターを列挙することから始めて、正しいアダプターのIDを関数に渡す必要があります。通常はGetInterfaceInfoでそれを行います。

+0

私はあなたが私に提案したリンクで見つけたサンプルコードを試しました。 ビジュアルベーシックをインストールする必要があったので、しばらく時間がかかりました。 とにかく、プログラムはウィット成功を呼び起こしましたが、IPは変更されませんでした。理由を教えてくれますか? 最初の投稿でコンパイルしたコードをコメントに追加するには長すぎます – Carme

+0

@Carme:DHCPサーバーは新しいリースに同じIPアドレスを割り当てることができます。たぶん、あなたのハードウェアアドレス(MACスプーフィング)を変更し、別のフリーIPアドレスを割り当てるためにDHCPサーバーを騙すかもしれません。しかし、ルータWebインターフェイス経由で可能なので、正しいHTTPパケットシーケンスをルータにC++で送信することができます。 – Rocki

+0

私はMACアドレスを変更しようとしました...私は新しいIPv4アドレスを取得しますが、新しいパブリックIPアドレスは取得しません。 – Carme

0

私の動的IPを変更すると、私の公的IPも変わってしまいます。しかしそうではありません。 私のパブリックIPアドレスを変更するには、私は動的IPを変更する必要はありませんが、私はROUTER IPを変更する必要があります。 実際にISPは、接続されているすべてのdevidesのパブリックIPとなるルーター接続にipを割り当てます。

(パブリックIPのために、私はあなたがhttp://www.ipmy.it/で見ることができるIPアドレスを意味する)

私は私のパブリックIPアドレスを変更したいのであれば、私は私のルーターのIPアドレスを変更する必要があります。 これを変更するには、ルータの電源を切断して再接続する必要があります。またはルータのパネル(192.168.1.1)で行うことができます。

唯一の自動解決策は、そのhttp要求を実行するプログラムを書くことです。

libCURLを使用してC++で記述しました。

ありがとうございます。

関連する問題