Internet IP ermitteln?



  • Hallo,

    habe mir aus der FAQ-WinAPI den Quelltext zum ermitteln der Internet-IP genommen und meinem Programm hinzugefügt.

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

    Also habe die datei CGetIP.cpp und CGetIP.h meinem Projekt hinzugefügt und auch das #include "CGetIP.h" in der main.cpp.

    Beim compilieren kommt nun folgende fehlermeldung:

    bei Zeile: TCHAR *pszBuffer = (TCHAR*)calloc(MAX_LENGTH, sizeof(TCHAR));
    kommt diese Fehlermeldung---> implicit declaration of function `int calloc(...)'

    und bei Zeile: free(pszBuffer);
    diese---> implicit declaration of function `int free(...)'

    habe daraus dann das gemacht:

    TCHAR *pszBuffer;
    RecieveFile(pszBuffer); 
    CloseConnection(); 
    RecievedFileToIP(pszBuffer, pszIP); 
    //free(pszBuffer);
    

    und nun startet auch das Programm.
    Kann man das so machen?
    Aber dennoch erreiche ich nicht mein Ziel die Internet-IP zu ermitteln.
    mein Aufruf in der main.cpp sieht so aus:

    char IP_Adresse[255];
    CGetIP(IP_Adresse);
    

    als Ergebnis erhalte ich dann: IP_Adresse = checkip.dyndns.org
    Ist nun der Aufruf falsch oder liegt es an dem Fehler oben?

    Vielen Dank für eure Hilfe

    slower

    PS: benutze DevC++ neuste Version



  • Du hast das aber schon in einer cpp Datei drin, oder 🙄
    Naja, bei dem Code ist eben sehr viel dabei, was du eigentlich gar nicht brauchst - da findest du hier im Forum evtl. auch noch einen kürzeren. 😉
    Sitzt du hinter einem Router, oder gehst du direkt ins Internet?



  • ja klar, ist in einer cpp drin.

    das ist das problem, ich sitz hinter einem router und genau da wäre dieser code der richtige.



  • Ich denke, dass du die Klasse falsch verwendest! Der Konstruktor erwartet keine Parameter - und dann musst du GetInternetIP direkt aufrufen.
    Deine Code-Veränderung solltest du wieder rückgängig machen - den Speicher musst du schon reservieren 😉



  • und wie muss der code aussehen damit er läuft oder liegts am devc++?

    und wie sieht dann der aufruf von GetInternetIP aus?

    thx



  • Wie das mit DevC++ geht kann ich dir nicht sagen - du musst zumindest Ws2_32.lib und Wininet.lib linken. Ausgelesen habe ich das dann so:

    char IP_Adresse[255];
    CGetIP CIP;
    CIP.GetInternetIP(IP_Adresse);
    

    Allerdings wurde offenbar der Aufbau der Datei von DynDNS geändert - deswegen musst du in CGetIP::RecievedFileToIP mit strchr nicht nach \n, sondern nach < suchen. Außerdem würde ich das ganze einfach in eine normale Funktion packen. 🙄



  • ok thx, mit diesem aufruf gehts

    aber die speicherreservierung hab ich nicht hinbekommen, ist zwar nicht korrekt wie es dort oben steht aber es funktioniert.

    vielleicht hat ja noch jemand eine idee warum die speicherreservierung nicht geht.

    aber die ip kann ich jetzt bestimmen 🙂



  • Was für eine Speicherreservierung - wie sieht die aus 😕

    Ich hab den Code jetzt mal in eine Funktion gepackt (ist sicher noch der ein oder andere Fehler drinnen, da ich nicht oft in C/C++ programmiere):

    bool GetIP(char *ip)
    {
    	bool ret_val = false;
    
    	WSADATA m_wsaData;
    	WSAStartup(MAKEWORD(1, 1), &m_wsaData); 
    
    	if(HINTERNET m_hINet = InternetOpen("InetURL/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0))
    	{
    		if(HINTERNET m_hConnection = InternetConnect(m_hINet, "checkip.dyndns.org", 80, 0, 0, INTERNET_SERVICE_HTTP, NULL, 0))
    		{
    			if(HINTERNET m_hData = HttpOpenRequest(m_hConnection, "GET", 0, 0, 0, 0, INTERNET_FLAG_KEEP_CONNECTION, 0))
    			{
    				HttpSendRequest(m_hData, 0, 0, 0, 0);
    
    				char szBuffer[1024] = {0};
    				DWORD dwRead;
    				InternetReadFile(m_hData, szBuffer, 1024, &dwRead);
    
    				if(dwRead)
    				{
    					char szAddress[] = "Address: "; 
    					char *p;
    					if(p = strstr(szBuffer, szAddress))
    					{
    						p += lstrlen(szAddress); 
    						*strchr(p, '<') = 0;
    						if(ip) lstrcpy(ip,p);
    						ret_val = true;
    					}
    				}
    				InternetCloseHandle(m_hData);
    			}
    			InternetCloseHandle(m_hConnection);
    		} 
    		InternetCloseHandle(m_hINet);
    	}
    
    	WSACleanup();
    
    	return ret_val;
    }
    
    // [...]
    char ip[16];
    if(GetIP(ip)) MessageBox(hwnd,ip,"",0);
    


  • vielen dank für die mühe

    jetzt gehts perfekt 👍


Anmelden zum Antworten