IP-Control nutzen, um IP anzuzeigen



  • Hallo zusammen,

    ich hab mich jetzt durch die MSDN und FAQ gelesen, finde aber keinen richtigen Ansatz. Ich habe ein Programm geschrieben, was meine Internet-IP-Adresse von einer Website parst und versuche nun diese diese 1.) mit atoi in Zahlen umzuwandeln (Das werd ich noch selbst hinbekommen, denke ich) und dann in einem IP-Control anzeigen zu lassen.

    CString CIPAnzeigerDlg::getHtmlSource(CString url) 
    {       
          CString somecode, s;       
          CInternetSession session; 
          CInternetFile* file = NULL; 
    
          try 
          {       
             file = (CInternetFile*) session.OpenURL(url); 
          } 
          catch (CInternetException* m_pException) 
          {       
             file = NULL; 
             m_pException->Delete(); 
          } 
    
          if(file) 
          {       
             while (file->ReadString(somecode) != NULL) 
             { 
                s = s + somecode; 
             } 
          } 
    
          file->Close(); 
          s.Delete(0,20); 
          return s; 
    }
    
    void CIPAnzeigerDlg::OnButton3() 
    {
    	// TODO: Add your control notification handler code here
    	CString strHTMLText = ""; 
    strHTMLText = getHtmlSource("http://checkip.dyndns.org/"); 
    int i = strHTMLText.Find("Address:"); 
    int n = strHTMLText.Find("<", i); 
    strHTMLText = strHTMLText.Mid(i+8, (n-i)-8); 
    AfxMessageBox(strHTMLText);
    }
    

    Das ist schonmal mein Code, damit wird dann wie gesagt eine Messagebox aufgerufen, die dann meine IP zeigt.
    Meine Frage also nochmal: Wie gehe ich denn nun jetzt konkret vor, wenn ich das ganze mit einem IP-Control anzeigen lassen möchte? (Ich finde es nämlich lästig erst auf einen Button drücken zu müssen, wenn man seine IP wissen möchte).
    Vielen Dank für eure Hülfe



  • Ob du einen Button drücken musst oder nicht hat nichts mit einem Control zu tun.
    Das Control nimmt dir die Arbeit nicht ab sondern zeigt deine Arbeit nur entsprechend an.



  • Ich möchte ja einfach nur wissen, wie ich denn konkret die IP-Ctrl. dafür einsetzen kann, anstatt das ganze über eine Messagebox laufen zu lassen 😕



  • ....hmm, kann mir denn wirklich keiner weiterhelfen?

    Ich dachte dieses Problem wäre eher trivialer Natur. (Und nicht mal das kann ich alleine lösen, Hilllfeee 😞 )



  • AfxSocketInit(NULL);
    	hostent *hEnt = 0;
    	char hostname[20];
    	gethostname(hostname,20);
    	hEnt = gethostbyname( hostname );
        if ( hEnt )
    	{
    		m_ip.SetWindowText(inet_ntoa( *(LPIN_ADDR)*hEnt->h_addr_list ));
    	}
    

    CIPAddressCtrl m_ip;



  • Hi,

    also wenn du parsen kannst, könntest du doch einfach
    deine Router-IP die du da in CString strHTMLText erhalten
    hast wieder bis zu den Punkten parsen und die 4 IP-Segmente
    als int in CIPAddressCtrl schreiben.

    Das machst du dann z.B. so:

    m_ip.SetAddress(int1,int2,int3,int4);

    Unix-Tom schrieb:

    CIPAddressCtrl m_ip;

    Umwandeln CString in int steht sonst in der FAQ falls es da
    Probleme gibt. Ich glaube so schwer ist es doch nicht 😉
    Und wenn du den ganzen Spaß in OnInit packst muss man auch keinen
    Button drücken. Online sollte man natürlich dann schon sein 😃



  • Ok,

    ich hab mir jetzt also folgende kleine Funktion gemacht

    int Stringintumwandler()
    {
    	CString strHTMLText;
    	int IP1 = atoi(strHTMLText);
    	return IP1;
    }
    

    Ich hab bloss noch nicht verstanden, wie ich das jetzt in mein IP-Ctrl. bekomme?? (Ich muss für meinen IP-Ctrl auch eine Member-Variable machen, oder?) 😕



  • Ach so und das mit dem OnINIT ist mir auch noch nicht so klar *hüstel*

    Danke für eure Hilfe



  • Ok, das mit dem INIT-Dialog ist mir nun klar. (Hätte vielleicht vorher mal nachgedacht, anstatt direkt zu fragen 🙄 )

    Ich kämpfe jetzt also nur noch mit der Umsetzung in mein IP-Ctrl.

    Ich weiß zwar, wie ich meinen HTML-String jetzt mit Hilfe von atoi in Zahlen umwandeln kann bzw. ich denke mal, so dürfte es klappen, oder?

    CString strHTMLText = ""; 
    strHTMLText = getHtmlSource("http://checkip.dyndns.org/"); 
    int i = strHTMLText.Find("Address:"); 
    int n = strHTMLText.Find("<", i); 
    strHTMLText = strHTMLText.Mid(i+8, (n-i)-17); 
    int IP1 = atoi(strHTMLText);
    strHTMLText = strHTMLText.Mid(i+13, (n-i)-18);
    int IP2 = atoi(strHTMLText);
    ....
    

    So isoliere ich die einzelnen Zahlen in dem Strin und wandle sie nacheinander mit atoi in Zahlen um. Nachteil bei der ganzen Sache ist bloss, dass das in die Hose geht, sobald sich meine IP Zahl mal komplett ändert, d.h. statt xxx.xxx.2.xxx in z.B. xxx.xxx.115.xxx. Dann hab ich nämlich 3 Stellen für eine Zahl, die eigentlich nach meinem Programm nur zwei haben dürfte und der String wird nicht mehr richtig abgeschnitten. Eigentlich würde es mir mehr gefallen, wenn man die IP direkt aus dem PC auslesen würde, anstatt das ganze über eine Website zu parsen. Ich hab dafür auch mal das komplette Forum hier durchsucht. (Aus der MSDN wird man in diesem Fall nämlich nicht schlauer), aber ausser 3 Beiträgen, die die eigene IP im LAN auslesen hab ich nichts gefunden. Wenn also einer von euch einen Ansatz hat, und den hier postet würde mich das sehr freuen 🙂 oder jmd. erklärt mir was dieser Code denn bedeutet bzw. wie ich ihn korrekt einbinde

    AfxSocketInit(NULL); 
        hostent *hEnt = 0; 
        char hostname[20]; 
        gethostname(hostname,20); 
        hEnt = gethostbyname( hostname ); 
        if ( hEnt ) 
        { 
            m_ip.SetWindowText(inet_ntoa( *(LPIN_ADDR)*hEnt->h_addr_list )); 
        }
    

    Danke



  • Hallo,

    ich bin zwar auch kein Meister der Kunst, aber ich glaube du denkst zu viel 😉
    Unix-Tom hat doch schon die vollständige Lösung gepostet.
    Und ja du musst eine Membervariable für dein IP-Control anlegen.
    Diese nennst du dann "m_ip".

    Und wie du die einzelnen Integerwerte deiner nun zerlegten Internet-IP
    in dieses m_ip schreibst habe ich doch auch schon geschrieben 😉

    Mein Lösungsvorschlag bezog sich auf deine Parserei 😃 ,
    weil ich nur einen Grund kenne warum man die IP aus einer
    Websiet zieht: man sitzt hinter einem Router !

    Und genau dann erhältst du bei dem Beispiel von Unix-Tom
    eben nur die LAN-IP (z.B. 192.68.0.2), die dir vom Router
    zugewiesen wird (wenn DHCP aktiv).

    Du brauchst nicht weiter im Forum oder sonstwo suchen.
    Das Thema ist hier imho vollständig abgehandelt :p



  • Hmm, ich weiß aber nicht genau, wo ich denn den geposteten Code hinsetzen soll?
    Für die IP-Ctrl. kann ich mit dem Class-Wizard nur ein en_change-Code einfügen...

    Ich hab im meinem Netzwerk eine IP und wenn ich mich ins Internet einlogge bekomme ich von meinem Provider ebenfalls ein IP. Diese unterscheidet sich ja logischerweise von meiner Netzwerk-Adresse. Ich hab hier keinen Router (dann hätte ich ja eine feste IP-Adresse und bräuchte meine nicht ständig zu ermitteln). Deswegen dieses Programm.

    Wie gesagt, mit dem geposteten Code kann ich (momentan jedenfalls) nocht nichts anfangen, weil ich nicht weiss, wohin damit 😕 😞



  • Nochmal, damit es keine Verwechslung gibt. Ich will meine Internet!!IP-Adresse haben, nicht die von meinem LAN..


Log in to reply