2009-07-21 5 views
1

Wie bekomme ich die gleiche IP-Adresse, die ich bekomme, wenn ich mit C++ und Winsock-Bibliothek zu "http://www.whatsmyip.org/" gehe?Was ist der Trick hinter der physischen IP-Adresse?

Ich weiß, wie die "127.0.0.1" zu erhalten und die Router-IP "192.168.1.103" ... Aber als ich auf "http://www.whatsmyip.org/" ich "65.55.105.132" ...

Wie kann ich das erreichen?

+0

Da niemand dies erwähnt: es ist möglich, die öffentliche IP eines Routers über UPnP abzurufen, wenn der Router es unterstützt. – avakar

+0

In Verbindung stehend: http://stackoverflow.com/questions/66363/get-external-ip-address-over-remoting-in-c http://stackoverflow.com/questions/917332/getting-my-ip-address – Helen

Antwort

15

In einer allgemeinen Weise - Sie können nicht. Sie könnten eine http-Verbindung zu Whatmyip öffnen und das Ergebnis analysieren. Oder wie Justin in den Kommentaren vorschlägt, verwenden Sie http://www.whatismyip.com/automation/n09230945.asp und sparen Sie beim Parsen und der Bandbreite. Aber am Ende wird dir das nur die IP des NAT/proxy geben, egal was zwischen dir und whatsmyip ist. Diese Adresse ist nur durch Weiterleitung mit Ihrem Computer verbunden.

Es gibt keine allgemeine Möglichkeit, die Internet-IP-Adresse Ihres Routers abzurufen (das ist die 65.55.105.132 IP, die Sie sehen.) Selbst wenn Sie könnten, gibt es keinen Grund, dass es keine weiteren Schichten von NATing mehr geben könnte Im weg.

+0

+1, nicht wissen, warum Sie downvoted wurden. Deine Antwort ist richtig. –

+8

http://www.whatismyip.com/automation/n09230945.asp ist eine bessere Seite für diese Frage – Justin

+0

@Justin - danke! Das hatte ich vorher nicht gesehen. – Eclipse

3

Sie können nicht.

http://www.whatsmyip.org sagt Ihnen, die IP-Adresse sieht es, wenn Sie mit ihm sprechen. Es könnte Ihren oder einen Proxy-Server oder eine NAT-Box oder etwas anderes sehen. Du kannst es nicht wissen.

Was möchten Sie erreichen?

0

Nun, es gibt wirklich keinen Trick. Der Grund, warum www.whatsmyip.com Ihre "externe" IP-Adresse angeben kann, ist, dass sie eine Anfrage erhalten, die NATed (Network Address Translation) von Ihrem Router erhalten hat und so Ihre öffentliche IP-Adresse sieht. Das ist etwas, das man nicht wirklich an einer beliebigen internen Host in Ihrem Netzwerk erhalten kann - nicht, wenn Sie a server on the outside haben, dass Sie einen Mechanismus abfrage oder haben könnten Ihren Router, welche IP-Adresse, die er verwendet, um zu fragen, wann öffentliche Internet-Anfragen machen ..

+1

Und in vielen Fällen wird sich seine öffentliche IP-Adresse wahrscheinlich von Moment zu Moment ändern. –

0

Wie andere schon gesagt haben, gibt es vielleicht keine einfache/großartige Lösung. Eine (wenn auch hacky) Lösung könnte sein, den Systemaufruf 'tracert' zu umgehen. Ex:

tracert google.com 

Dieser Aufruf wird eine Liste von allen Routern zwischen Ihrem PC und google.com Sie können dann durch die Ergebnisse durchlaufen, wobei den ersten Knoten, der keine (oder was auch immer externe Seite.) private IP address Reichweite. (I.e., nicht 192.168. . usw.)

Zugegeben, dies ist keineswegs eine elegante Lösung. Es kann Ihnen jedoch die Informationen geben, die Sie benötigen. Als Test können Sie das oben genannte einfach von einer Befehlszeile ausführen und sehen, ob es hilfreich ist.

+0

@Eric Pi: Wie oft wird sich das ändern? –

+0

@John: Einige Abschnitte der gesamten Tracert-Route werden sich wahrscheinlich sehr oft ändern. (Abhängig davon, welche Router/Server ein bestimmtes Paket verarbeiten.) Die ersten paar Hops sollten jedoch einigermaßen stabil sein - Änderungen nur, wenn der Benutzer das interne Netzwerk/Router-Setup ändert. –

+0

@Und wenn er das Wissen in ein Programm einbindet, dann wird sein Programm, wenn sich das interne Netzwerk/Router-Setup ändert, unterbrochen, es sei denn, seine "Netzwerk-Leute" denken den Entwicklern, dass sie harmlose Änderungen vornehmen werden das Netzwerk. –

1

Es gibt keine Möglichkeit, dies zu tun, ohne etwas zu verwenden, die außerhalb des Netzwerks ist.

Die Adresse zurückgegeben wird, ist die erste öffentliche IP-Adresse zwischen Ihrem Computer und der Außenwelt. 10. , 192.168., 172. [16-31]. * IP-Adresse ist "privat" und sollte nicht intakt an eine nicht private IP-Adresse weitergeleitet werden.

An einem gewissen Punkt müssen private IP-Adressen auf eine öffentliche IP-Adresse verknüpft werden. Die erste öffentliche IP-Adresse im Pfad von Ihrem Computer zur Website whatsmyip.com wird auf dieser Seite angezeigt. Der Trick ist, dass Ihr Computer eine öffentliche IP hat, oder dass es eine gewisse Anzahl von Hops zu Computern/Switches/Routern gibt, die private IP's haben, bis es schließlich eine öffentliche IP gibt.Es gibt keine Möglichkeit zu wissen, wie viele Hops es gibt, und je nach Netzwerk kann sich die Route von einer Anforderung zu einer anderen ändern und die Anzahl der Hops kann unterschiedlich sein (unwahrscheinlich für ein Heimnetzwerk, aber wahrscheinlicher in einer Firmennetzwerk).

Die einzige Möglichkeit, die erste öffentliche IP-Adresse zu erhalten, besteht darin, ein Paket an eine öffentliche Adresse zu senden und die zurückgelegte Route zu verfolgen. Diese Route kann (und wird) sich in einem komplexen Netzwerk ändern.

Wenn Sie ein bestimmtes Problem haben, das Sie lösen möchten, gibt es möglicherweise eine bessere Antwort.

1

Wie andere bereits gesagt haben, benötigen Sie eine dritte Partei im Netzwerk wie whatismyip.com, um Ihnen Ihre IP-Adresse mitzuteilen. Ich wollte nur hinzufügen, Sie sollten sich nicht auf whatismyip.com verlassen, stattdessen sollten Sie in Erwägung ziehen, Ihre eigenen einzurichten, da solche Dienste dazu neigen und kommen oder ändern, wer sich mit ihnen verbinden kann (siehe this example für warum das passieren könnte) .

Sie können einen Dienst einfach nur für Ihre Anwendung kostenlos, sagen wir, basierend auf Google AppEngine einrichten. Der erforderliche Anforderungshandler könnte etwa wie folgt aussehen:

from google.appengine.ext import webapp 

class RemoteAddressHandler(webapp.RequestHandler): 
    def get(self): 
     self.response.out.write(self.request.remote_addr) 
+0

Und das wiederum kann keine feste Adresse sein, auch wenn er über eine eingehende Verbindung erreichbar ist. –

0

Wow, das war eine sehr schnelle Antwort. Danke Jungs für die Antworten, jetzt weiß ich es besser.

Ich baue derzeit einen C++ HTTP-Server für Lernzwecke. Ich beende die IP-Adresse, die ich erhalte, wenn ich zu "whatismyip.org" komme, an meine private IP "192.168.1.3" weiter, damit ein externer Anruf von meinem Server gehandhabt wird. So ziemlich habe ich einen einfachen C++ Server erstellt. Allerdings verwende ich etwas namens No-IP DUC, um "yellowyackets.no-ip.org" in meine öffentliche IP zu übersetzen, so dass die Leute sich meine öffentliche IP nicht merken müssen. Aber weil sich die IP ändert, muss ich immer auf dem Laufenden halten, was meine neue IP ist, damit die Leute sich mit mir verbinden können ... also muss ich zu "whatsmyip.org" gehen, um meine neue IP zu kennen. Dann wollte ich ein Programm erstellen, das mir sagen würde, dass das meine neue IP ist.

Ich weiß nicht, ob das, was ich gerade gesagt habe sinnvoll, aber ... Ich bin brandneu auf Servern ... Wie gesagt, das ist für Lernzwecke.

Nochmals vielen Dank. und viel Glück für alle.

0

enter image description here

One c/C++ Weg, um die externe IP zu bekommen ist ein Web-basierte IP-Adresse API-Tool zu verwenden, laden Sie die Website-Adresse mit Ihrer IP in einen char-Array und extrahieren Sie die IP-Adresse aus der HTML-Quelle . Hier ist ein Winsock-Code, um es zu demonstrieren. es verwendet http://api.ipify.org/ 's online web api.

// 
// Winsock get external ip address from website api at api.ipify.org 
// api.ipify.org 
// 

#include <string.h> 
#include <stdio.h> 

#include <winsock2.h> 
#include <windows.h> 
#include <iostream> 
#include <vector> 

#include <algorithm> 
#include <cctype> 
#include <locale> 
#include <fstream> 
#include <ctime> 
#include <cstdlib> 

using namespace std; 
#pragma comment(lib,"ws2_32.lib") 


string website_HTML; 
locale local; 
char ipaddress[16]; 
int ic=0; 
void get_Website(char *url); 
char mystring[] = " "; 
char seps[] = " ,\t\n"; 
char *token; 
char lineBuffer[200][80] ={' '}; 
char buffer[10000]; 
char ip_address[16]; 
int i = 0, bufLen=0, j=0,lineCount=0; 
int lineIndex=0, posIndex=0; 


int main(void){ 

    SYSTEMTIME st; 
    GetLocalTime(&st); 
    char *today = new char[32]; 
    memset(today,' ', sizeof(today)); 
    sprintf(today,"%d-%d-%d", st.wYear , st.wMonth , st.wDay); 
    memset(buffer,'\0',sizeof(buffer)); 

    get_Website("api.ipify.org"); 
    for (size_t i=0; i<website_HTML.length(); ++i) website_HTML[i]= tolower(website_HTML[i],local); 

    token = strtok(buffer , seps); 
    while(token != NULL){ 

     strcpy(lineBuffer[lineIndex],token); 
     int dot=0; 
     for (int ii=0; ii< strlen(lineBuffer[lineIndex]); ii++){ 

      if (lineBuffer[lineIndex][ii] == '.') dot++; 
      if (dot>=3){ 
       dot=0; 
       strcpy(ip_address,lineBuffer[lineIndex]); 
      } 
     } 

     token = strtok(NULL, seps);  
     lineIndex++; 
    } 
    cout<<"Your IP Address is "<< ip_address<<" \n\n"; 

return 0; 
} 


void get_Website(char *url){ 
    WSADATA wsaData; 
    SOCKET Socket; 
    SOCKADDR_IN SockAddr; 
    int lineCount=0; 
    int rowCount=0; 
    struct hostent *host; 
    char *get_http= new char[256]; 

    memset(get_http,' ', sizeof(get_http)); 
    strcpy(get_http,"GET/HTTP/1.1\r\nHost: "); 
    strcat(get_http,url); 
    strcat(get_http,"\r\nConnection: close\r\n\r\n"); 

    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0){ 
     cout << "WSAStartup failed.\n"; 
     system("pause"); 
     //return 1; 
    } 

    Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    host = gethostbyname(url); 

    SockAddr.sin_port=htons(80); 
    SockAddr.sin_family=AF_INET; 
    SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr); 

    if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0){ 
     cout << "Could not connect"; 
     system("pause"); 
     //return 1; 
    } 
    send(Socket,get_http, strlen(get_http),0); 

    int nDataLength; 
    while ((nDataLength = recv(Socket,buffer,10000,0)) > 0){   
     int i = 0; 
     while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r'){ 

      website_HTML+=buffer[i]; 
      i += 1; 
     }    
    } 

    closesocket(Socket); 
    WSACleanup(); 
    delete[] get_http; 
}