Aktuelle IP-Adresse ermitteln



  • Hallo,

    das Thema gab's zwar schonmal aber irgendwie bekomme ich es nicht gebacken. Ich möchte meine aktuelle IP-Adresse (zur Internetvebindung) herausbekommen.

    Folgenden Code benutze ich:

    CString CDynIPDlg::getIP()
    {
     char hostname[20];
     hostent *hEnt = 0;		// Struktur
     CString ipAddr = "0.0.0.0";
    
     AfxSocketInit(NULL);
     gethostname(hostname, sizeof(hostname)-1);
     hEnt = gethostbyname(hostname);
    
     if(hEnt) 
     { 
      int count = 0;
      while (hEnt->h_addr_list[count] != NULL)
      {
       int ip1 = (unsigned int) hEnt->h_addr_list[count][0];
       if(ip1 != 127 && ip1 != 192)
       {
        ipAddr = inet_ntoa( *(LPIN_ADDR)*hEnt->h_addr_list );
        //MessageBox(ipAddr, ipAddr, NULL);
       }
       count++;
      }
     } 
     return ipAddr;
    }
    

    Aber irgendwie haut das nicht hin. Er liefert mir immer noch eine 192.168..... IP-Adresse. Kann mir irgendjemand weiterhelfen?

    Vielen Dank, Stefan



  • #define NUM_ELEMENTS(x)  (sizeof((x)) / sizeof((x)[0])) // Für IP auslesen
    CString CRadioIPDlg::GetIP()
    {
    	CString IP_ADDRESSE;
    	struct    hostent* h;
    	WSADATA   wsaData;
    	UCHAR     ucAddress[4];
    	CHAR      szHostName[MAX_PATH];
    	int       x; 
    
    	WSAStartup(MAKEWORD(1, 1), &wsaData);
    
    	if(SOCKET_ERROR != gethostname(szHostName, NUM_ELEMENTS(szHostName)))
    	{
    		if(NULL != (h = gethostbyname(szHostName)))
    		{
                for(x = 0; (h->h_addr_list[x]); x++)
                {
    
                    ucAddress[0] = h->h_addr_list[x][0];
                    ucAddress[1] = h->h_addr_list[x][1];
                    ucAddress[2] = h->h_addr_list[x][2];
                    ucAddress[3] = h->h_addr_list[x][3];
    
                    IP_ADDRESSE.Format("%d.%d.%d.%d", ucAddress[0], ucAddress[1], ucAddress[2], ucAddress[3]);
                }
            }
        }
        WSACleanup();
    
    	AfxMessageBox(IP_ADDRESSE);
    	return IP_ADDRESSE;
    }
    

    So hab ich das mal gemacht. Ich weiß nich ob das besonders schön ist, aber es hat funktioniert.
    Ach noch was: Falls du hinter einem Router sitzt, funktioniert das nicht. Dann musst du das anders lösen (gibts auch ne Lösung zu, hab ich aber nicht im kopf, schau mal in die FAQ)



  • Hallo, danke für die Hilfe! Leider funktioniert das auch nicht! Bekomme nur die 192.... IP-Adresse von meinem Rechner! Ich sitze auch nicht hinter einem Router! Vielleicht noch jemand einen Tip??

    Vielen Dank, Stefan



  • Beide Versionen sind fast gleich.

    Hast du schnmal versucht zu debuggen. Normalerweise hat ein Rechner keine 192er IP wenn nihct gerade eine Netzwerkkarte drin ist.

    Ohne Netzwerkkarte und INET hat er eine LoopBACK mit 127.0.0.1
    Geht mal die einzelnen Einträge beim Debuggen durch .



  • Beide Versionen sind fast gleich.

    Hast du schnmal versucht zu debuggen. Normalerweise hat ein Rechner keine 192er IP wenn nihct gerade eine Netzwerkkarte drin ist.

    Ohne Netzwerkkarte und INET hat er eine LoopBACK mit 127.0.0.1
    Geht mal die einzelnen Einträge beim Debuggen durch .

    Hallo

    Wenn ich's auf meinem Laptop ohne Netzwerkkarte (bzw. mit Netzwerkkarte aber ohne angeschlossenes Kabel) probiere, hat er auch die 127.0.0.1! Das ist ja auch richtig. Dort habe ich keine Netzwerkkarte weiter drinnen. Aber bei meinem Vater auf dem Rechner kommt immer die 192.168......
    Der hat aber auch keine richtige Netzwerkkarte drinnen, sondern ein DSL-Modem. Dieses bekommt aber anscheinend auch immer eine IP zugewiesen.
    Aber selbst wenn ich nun eine Verbindung mit dem Internet herstelle, findet mein Programm nur die 192.168.... IP. Das habe ich ja auch durch die Messagebox ausprobiert.
    Debuggen kann ich nur auf meinem Laptop weil ich nur dort Visual Studios drauf habe. Aber da finde ich auch immer nur die 127.0.0.1!

    @Unix-Tom: Kann man bei deiner Wrapper-Klasse zufällig irgendwie den Pfad zu der DLL ändern? Würde diese gerne in ein extra Verzeichnis legen!

    Viele Grüße, Stefan

    P.S. Mal was anderes: Warum nimmt er in meinem Quellcode immer noch die 192.... IP obwohl ich das eigentlich in der if-Anweisung ausschließe?

    Nachtrag: Habe es gerade nochmal ausprobiert. Der findet nur die IP-Adresse der Netzwerkkarte. Kann denn keiner mal bei sich das ausprobieren?



  • Habs jetz erst gesehen.

    h_addr_list[count]
    Das machst du in deiner IF nicht. Somit kommt der erste Adapter.

    Ändere das auf

    CString CDynIPDlg::getIP()
    {
     char hostname[20];
     hostent *hEnt = 0;        // Struktur
     CString ipAddr = "0.0.0.0";
    
     AfxSocketInit(NULL);
     gethostname(hostname, sizeof(hostname)-1);
     hEnt = gethostbyname(hostname);
    
     if(hEnt) 
     { 
      int count = 0;
      while (hEnt->h_addr_list[count] != NULL)
      {
       int ip1 = (unsigned int) hEnt->h_addr_list[count][0];
       if(ip1 != 127 && ip1 != 192)
       {
        ipAddr = inet_ntoa( *(LPIN_ADDR)*hEnt->h_addr_list[count][ );  // Hier die änderung
        //MessageBox(ipAddr, ipAddr, NULL);
       }
       count++;
      }
     } 
     return ipAddr;
    }
    


  • Welche Wrapperklasse ?



  • Die mysql-Wrapperklasse für VC++ 6.0!



  • dann legt sie in ein Extra verzeichnis. Nicht das Programm sucht die Datei sondern Windows.
    Zuerst wird im aktuellen progrmm ´verz. gesucht und dann in den PFADEN von Windows. z.B. c:windows/system32 us.w.
    Übrigens ist dies mit jeder DLL so da man nicht angeben kann wo die DLL gesucht werden soll.



  • Ok, danke! Aber ich glaube es gibt eine Lsg. die dll statisch zu linken. Ist aber auch nicht so wichtig!

    Trotzdem besteht aber das Problem mit der IP noch!?!?

    MFG Stefan



  • Hi!

    Schau mal hier nach:
    http://www.codeproject.com/Purgatory/localipquery.asp

    Gruß Andreas



  • Ich benutze diesen Code von Darth_Kane:

    http://www.c-plusplus.net/forum/viewtopic.php?t=44874

    Funktioniert einwandfrei.



  • Vielen Dank, ich denke jetzt es liegt an diesem komischen DSL-Modem von meinem Vater! Wenn ich nämlich netstat -r eingebe kommt folgendes raus:

    ===========================================================================
    Schnittstellenliste
    0x1 ........................... MS TCP Loopback interface
    0x2 ...00 04 0e ff ff ff ...... AVM FRITZ!web DSL PPP - Paketplaner-Miniport
    ===========================================================================
    ===========================================================================
    Aktive Routen:
         Netzwerkziel    Netzwerkmaske          Gateway   Schnittstelle  Anzahl
              0.0.0.0          0.0.0.0    192.168.122.1  192.168.122.254	  1
            127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1	  1
        192.168.122.0    255.255.255.0  192.168.122.254  192.168.122.254	  1
      192.168.122.254  255.255.255.255        127.0.0.1       127.0.0.1	  1
      192.168.122.255  255.255.255.255  192.168.122.254  192.168.122.254	  1
            224.0.0.0        240.0.0.0  192.168.122.254  192.168.122.254	  1
      255.255.255.255  255.255.255.255  192.168.122.254  192.168.122.254	  1
    Standardgateway:     192.168.122.1
    ===========================================================================
    Ständige Routen:
      Keine
    
    Routingtabelle
    

    Und das es da ein Standard-Gateway gibt ist doch sehr komisch. Also wird das ganze irgendwie wie bei einem Router gehandelt (vermute ich)!
    Trotzdem vielen Dak für die Hilfe!!!

    MFG Stefan

    P.S. Gibts irgendeine Lösung um an die richtige IP zu kommen, wenn man hinter einem Router sitzt???



  • Hab dir doch die Lösung mit der IP oben geschrieben.



  • Unix-Tom schrieb:

    Hab dir doch die Lösung mit der IP oben geschrieben.

    Sorry, das ist mir erst jetzt aufgefallen! Habe ich ausprobiert aber klappt auch nicht.
    Habe inzwischen herausgefunden, dass bei manchen DSL-Modems bzw. wenn ein Router davor sitzt, man die IP nur herausbekommt, in dem man sie aus einer html-Seite ausliest! Eine andere Möglichkeit gibt's anscheinend nicht.

    MFG Stefan


Log in to reply