2016-03-25 12 views
6

द्वारा अपना डायनामिक आईपी पता बदलें मेरे पास एक गतिशील आईपी पता है, वास्तव में मैं इसे अपने राउटर पेज (http://192.168.1.1) से रिलीज पर क्लिक करके बदल सकता हूं और फिर नवीनीकृत कर सकता हूं।सी ++

मैं http://192.168.1.1 पृष्ठ पर कर्ल द्वारा http अनुरोध कर सकता था, लेकिन यह केवल मेरे कंप्यूटर पर समस्या को हल करता है जो राउटर का उपयोग करता है।

तो मुझे यह जानने में दिलचस्पी है कि राउटर पेज (1 9 2.168.1.1) से गुज़रने के बिना सी ++ द्वारा अपना आईपी अपडेट करने का कोई तरीका है या नहीं।

मैंने सकारात्मक परिणाम के बिना कमांड लाइन से भी कोशिश की है। कोड मैं कोशिश की है है निम्नलिखित:

#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 सर्वर सक्षम तिनका इन मूल्यों: डीएचसीपी सेवा राज्य डीएचसीपी राज्य

ipconfig /release 

ipconfig /renew 

मैं इस कोड की कोशिश की है : सक्षम आईपी iniziale डीएचसीपी: 192.168.1.2 आईपी समापन समारोह डीएचसीपी (Riservato प्रति uso आंतरिक): 192.168.1.254

मैं Windows XP और Windows 7 pl पर अपने कार्यक्रम चलाने की जरूरत है atform।

धन्यवाद के लिए आपकी मदद की

+0

मुझे लगता है कि आपका राउटर एक डीएचसीपी सर्वर चलाता है। इस मामले में आप एक 'DHCPRELEASE' पैकेट भेज सकते हैं और एक नया आईपी पता का अनुरोध कर सकते हैं। – Rocki

+0

मुझे लगता है कि मेरे राउटर को एक डीएचसीपी सर्वर मिला है, वास्तव में मैं राउटर पेज द्वारा अपना आईपी बदल सकता हूं। क्या सी ++ का उपयोग करके 'DHCPRELEASE' भेजने का कोई तरीका है? – Carme

+0

यदि आप बस अपने नेटवर्क इंटरफ़ेस पर आईपी बदलना चाहते हैं, तो इस http://stackoverflow.com/questions/1070351/getadaptersinfo-and-getadaptersaddressess-bufferlength-param को पढ़ने से शुरू करें और एमएसडीएन https://msdn.microsoft पर आगे बढ़ें। कॉम/आरयू-आरयू/लाइब्रेरी/विंडोज/डेस्कटॉप/aa366028% 28v = vs.85% 29.aspx और https://msdn.microsoft।कॉम/आरयू-आरयू/लाइब्रेरी/विंडोज़/डेस्कटॉप/aa366309% 28v = बनाम.85% 29.aspx – user2807083

उत्तर

4

के लिए आईपी हेल्पर कार्यों IPReleaseAddress और IPRenewAddress शामिल वास्तव में यह करने के लिए।

हालांकि आपको नेटवर्क एडेप्टर की गणना करके शुरू करना होगा, और कार्य करने के लिए सही एडाप्टर आईडी को पास करना होगा। आप आमतौर पर GetInterfaceInfo के साथ ऐसा करते हैं।

+0

मैंने आपके द्वारा सुझाए गए लिंक में पाए गए उदाहरण कोड का प्रयास किया है। मुझे कुछ समय लगा क्योंकि मुझे दृश्य मूलभूत स्थापित करना पड़ा था। वैसे भी कार्यक्रम ने श्वेत सफलता को समाप्त कर दिया लेकिन आईपी नहीं बदला गया था। क्या आप मुझे कारण बता सकते हैं? मैं उस कोड को जोड़ दूंगा जिसे मैंने पहली पोस्ट में संकलित किया है क्योंकि टिप्पणी में रहने में बहुत लंबा समय है – Carme

+0

@Carme: DHCP सर्वर नए पट्टे के लिए एक ही आईपी पता असाइन करने के लिए स्वतंत्र है। हो सकता है कि आप अपना हार्डवेयर पता (मैक स्पूफिंग) बदल सकें और डीएचसीपी सर्वर को एक और मुफ्त आईपी एड्रेस सौंपने के लिए ट्रिक कर सकें। हालांकि राउटर वेबइंटरफेस के माध्यम से यह संभव है, इसलिए आप सी ++ के साथ अपने राउटर में सही HTTP पैकेट अनुक्रम भेज सकते हैं। – Rocki

+0

मैंने मैक एड्रेस बदलने की कोशिश की है ... मुझे एक नया आईपीवी 4 पता प्राप्त है लेकिन एक नया सार्वजनिक आईपी एड्रेस नहीं है। – Carme

0

मुझे लगता है कि मेरे गतिशील आईपी को बदलना मैं भी अपना सार्वजनिक आईपी बदलूंगा। लेकिन यह वैसा नहीं है। मेरे सार्वजनिक आईपी एड्रेस बदलने के लिए मुझे गतिशील आईपी नहीं बदलना है, लेकिन मुझे रूटर आईपी बदलने की जरूरत है। वास्तव में आईएसपी किसी भी राउटर कनेक्शन के लिए एक आईपी असाइन करें जो कि किसी भी डिवाइसेज के लिए सार्वजनिक आईपी होगा।

(सार्वजनिक आईपी के लिए मेरा मतलब आईपी पते आप http://www.ipmy.it/ में देख सकते हैं)

तो अगर मैं मैं अपने रूटर आईपी पते बदलने के लिए मेरी सार्वजनिक आईपी पते को बदलना चाहते हैं। इसे बदलने के लिए मुझे अपने राउटर पावर सप्लाई को डिस्कनेक्ट और रीकनेक्ट करना होगा, या मैं इसे राउटर पैनल (192.168.1.1) के माध्यम से कर सकता हूं।

तो एकमात्र स्वचालित समाधान http अनुरोध को निष्पादित करने वाले प्रोग्राम को लिखना है।

मैंने इसे libCURL का उपयोग करके C++ में लिखा था।

समर्थन के लिए सभी का शुक्र है।