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.

Geschrieben in Programmieren