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
-
-
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