2016-03-25 78 views
6

Ho un indirizzo IP dinamico, infatti posso cambiarlo dalla mia pagina del router (http://192.168.1.1) facendo clic sul rilascio e quindi rinnovare.Cambia il mio indirizzo IP dinamico da C++

Ho potuto effettuare la richiesta http di arricciamento alla pagina http://192.168.1.1 ma questo risolve il problema solo sui miei computer che utilizzano quel router.

Quindi sono interessato a sapere se c'è un modo per aggiornare il mio IP da C++ senza passare attraverso la pagina del router (192.168.1.1).

Ho provato anche dalla riga di comando senza risultato positivo. Il codice che ho provato è la seguente:

ipconfig /release 

ipconfig /renew 

Ho anche provato questo codice:

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

Sono DHCP abilitato Server whit questi valori: DHCP Servizio DHCP Stato Stato : Abilitato IP DHCP Iniziale: 192.168.1.2 IP finale DHCP (Riservato per uso interno): 192.168.1.254

ho bisogno di eseguire il mio programma su Windows XP e Windows 7 pl atform.

Grazie del vostro aiuto

+0

Immagino che il router esegua un server DHCP. In questo caso è possibile inviare un pacchetto 'DHCPRELEASE' e richiedere un nuovo indirizzo IP. – Rocki

+0

Penso che il mio router abbia un server DHCP, infatti posso cambiare il mio IP dalla pagina del router. C'è un modo per inviare 'DHCPRELEASE' usando C++? – Carme

+0

Se desideri semplicemente modificare l'ip dell'interfaccia di rete, inizia a leggere questo http://stackoverflow.com/questions/1070351/getadaptersinfo-and-getadaptersaddressess-bufferlength-param e vai avanti su MSDN https://msdn.microsoft. it/ru-ru/library/windows/desktop/aa366028% 28v = vs.85% 29.aspx e https://msdn.microsoft.it/ru-ru/library/windows/desktop/aa366309% 28v = vs.85% 29.aspx – user2807083

risposta

4

Le funzioni di supporto IP comprendono IPReleaseAddress e IPRenewAddress di fare esattamente questo.

Avrai bisogno di iniziare enumerando gli adattatori di rete e passare l'ID dell'adattatore corretto alle funzioni per farlo. Solitamente lo fai con GetInterfaceInfo.

+0

Ho provato il codice di esempio che ho trovato nei collegamenti che mi suggerisci. Mi ci è voluto un po 'di tempo perché dovevo installare Visual Basic. Ad ogni modo il programma terminava con successo ma l'IP non era cambiato. Puoi dirmi il motivo? Aggiungerò il codice che ho compilato nel primo post perché è troppo lungo per rimanere in un commento – Carme

+0

@Carme: il server DHCP è libero di assegnare lo stesso indirizzo IP per il nuovo leasing. Forse puoi cambiare il tuo indirizzo hardware (mac spoofing) e ingannare il server DHCP per assegnarti un altro indirizzo IP libero. Tuttavia, poiché è possibile attraverso l'interfaccia web del router, è possibile inviare la sequenza di pacchetti HTTP corretta al router con C++. – Rocki

+0

Ho provato a modificare gli indirizzi MAC ... Ottengo un nuovo indirizzo IPv4 ma non un nuovo indirizzo IP pubblico. – Carme

0

I thounght che cambiando il mio IP dinamico cambierei anche il mio IP pubblico. Ma non è così. Per modificare i miei IP IP pubblici Devo non modificare l'IP dinamico, ma ho bisogno di cambiare l'IP ROUTER. Infatti l'ISP assegna un IP per ogni connessione del router che sarà l'IP pubblico per eventuali devides connessi.

(Per IP pubblico voglio dire l'indirizzo IP si può vedere in http://www.ipmy.it/)

Quindi, se voglio cambiare il mio indirizzo IP pubblico devo cambiare il mio indirizzo IP del router. Per cambiarlo Devo disconnettere e ricollegare l'alimentazione del mio router, oppure posso farlo attraverso il pannello del router (192.168.1.1).

Quindi l'unica soluzione automatica è scrivere un programma che esegue quella richiesta http.

L'ho scritto in C++ usando libCURL.

Grazie a tutti per il supporto.