Daten|teiler
Kopieren als Kulturtechnik

Update: Meine IP-Adresse mit C/C++

14. März 2009 von Christian Imhorst

Laut dem WhatIsMyIP-Forum ist es sehr schwierig, seine eigene externe IP-Adresse mit einem C++-Programm herauszufinden. Dazu brauche man wenigstens 30 Zeilen Quellcode für den Socket, die Verbindung zum Server, die HTTP-Anfrage, das Abwarten der Antwort und so fort. Da ich das gerne glaube habe ich nicht wie in Perl oder Python ein eigenes kleines Programm bzw. eine eigene Funktion geschrieben, sonder auf die Funktion system() von C++ zurückgegriffen.

Mit system() kann man innerhalb eines C++-Programms ein anderes Programm ausführen. Hier zum Beispiel das Programm Curl, das bei den meisten Linux-Distributionen noch zusätzlich installiert werden muss. Bei Mac OS X ist es standardmäßig dabei. Hat man Curl installiert, kann man mit folgendem Programm seine externe IP-Adresse auf der Konsole anzeigen lassen:

#include <iostream>
#include <cstdlib>
 
using namespace std;
 
int main (void)
{
   if(system("curl 'http://whatismyip.com/automation/n09230945NL.asp'")==-1)
     cout << "Error executing Command"<<endl;
 
   return  EXIT_SUCCESS;
}

Update:
Für die Programmiersprache C gibt es die Bibliothek libcurl. Um sie zu nutzen habe ich die Version curl-7.19.4 heruntergeladen und mit dem berühmten Dreisatz ./configure && make && sudo make install kompiliert. Alternativ kann man auch das Paket libcurl3-dev aus dem Repository seiner Distribution installieren: mit Apt geht das durch dir Eingabe von apt-get install libcurl3-dev im Terminal. Danach habe ich mir folgendes kleines Beispiel “zusammenkopiert”:

/* myIP.c */
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
 
int main(void) {
   CURL *curl;
   CURLcode res;
   char whatismyip[50];
   strcpy(whatismyip, "whatismyip.com/automation/n09230945NL.asp");
 
   curl = curl_easy_init();
   if(curl) {
     curl_easy_setopt(curl, CURLOPT_URL, whatismyip);
     res = curl_easy_perform(curl);
 
     /* always cleanup */
     curl_easy_cleanup(curl);
   }
   return 0;
}

Beim Kompilieren des Beispiels muss man noch das Attribut -lcurl anhängen, um die Fehlermeldungen

/tmp/ccufDDUa.o: In function `main':
simple.c:(.text+0x8a): undefined reference to `curl_easy_init'
simple.c:(.text+0xb4): undefined reference to `curl_easy_setopt'
simple.c:(.text+0xbf): undefined reference to `curl_easy_perform'
simple.c:(.text+0xcd): undefined reference to `curl_easy_cleanup'
collect2: ld gab 1 als Ende-Status zurück

zu vermeiden. Eine weitere Fehlermeldung könnte die folgende sein:

/tmp/cc43idA6.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld gab 1 als Ende-Status zurück

Hier teilt der Linker mit, dass er zum Kompilieren noch die Option -lstdc++ benötigt. Weitere Optionen für den Linker liefert das Kommando curl-config --libs:

gcc -o myIP myIP.cpp -lcurl -lstdc++

Wenn alles fehlerfrei funktioniert hat, gibt der Befehl ./myIP im Terminal die eigene IP-Adresse zurück. Quellcode und Progamm kann man hier herunterladen.

Bücher zu C++

Geschrieben in Programmieren

7 Antworten

  1. Gerhard

    Und was hat das nun mit C++ zu tun? :)

  2. Christian Imhorst

    Leider nicht mehr viel, aber das kommt bestimmt noch. Spätestens wenn ich das als eigene Funktion ohne den Umweg über Curl mal gebastelt haben werde. Irgendwann dann… ;-)

  3. Dee

    Wieso “make install” und nicht “checkinstall”? Dann würdest Du libcurl nicht an der Paketverwaltung vorbei installieren und könntest es schnell und vor allem sauber wieder entfernen, wenn Du es nicht mehr brauchst.

  4. Christian Imhorst

    Hallo Dee,

    ich mache das, weil ich es so gewohnt bin. Natürlich kann man auch checkinstall verwenden, wenn man das möchte.

    Grüße,
    Christian

  5. luxi

    Die libcurl gibt es doch auch bestimmt in den Repos, oder?

  6. Christian Imhorst

    Hallo luxi,

    dann sag mir wo, ich habe es nicht gefunden.

    Viele Grüße,
    Christian

  7. luxi

    Na, entweder libcurl4-openssl-dev oder libcurl4-gnutls-dev.