C :: Aufgabe #141
1 Lösung
Standort einer beliebigen Ip-Adresse
Anfänger - C
von ZRX88
- 30.12.2016 um 13:04 Uhr
In Python Aufgabe 101 ( https://trainyourprogrammer.de/python-101-ermitteln-der-ip-klasse.html)
war die Aufgabenstellung für die eingegebene IP die Klasse zu bestimmen.
Viel spannender ist ( aus meiner Sicht) der Standort des Servers:
Nutzt die API https://freegeoip.net/ um den Standort der eingebenen Ip-Adresse ausgeben wird.
Beispiel:
Eingabe = 66.249.66.1
Ausgabe = Die Ip 66.249.66.1 befindet sich in dem Land US in der Stadt Mountain View, die Geo Koordinaten sind 37.4192,-122.0574
p.s. Die Beispiel Ip ist die Ip des Google Bots ;)
war die Aufgabenstellung für die eingegebene IP die Klasse zu bestimmen.
Viel spannender ist ( aus meiner Sicht) der Standort des Servers:
Nutzt die API https://freegeoip.net/ um den Standort der eingebenen Ip-Adresse ausgeben wird.
Beispiel:
Eingabe = 66.249.66.1
Ausgabe = Die Ip 66.249.66.1 befindet sich in dem Land US in der Stadt Mountain View, die Geo Koordinaten sind 37.4192,-122.0574
p.s. Die Beispiel Ip ist die Ip des Google Bots ;)
Lösungen:
Konsolenausgabe:
$ ./geoip 66.249.66.1
IP : 66.249.66.1
CountryCode : US
CountryName : United States
RegionCode : CA
RegionName : California
City : Mountain View
ZipCode : 94043
TimeZone : America/Los_Angeles
Latitude : 37.42
Longitude : -122.06
*******************************
* geoip.c Standort IP-Adresse
*******************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
#define WEBURL "http://freegeoip.net/csv/"
char *geoip_tags[] = { "IP",
"CountryCode",
"CountryName",
"RegionCode",
"RegionName",
"City",
"ZipCode",
"TimeZone",
"Latitude",
"Longitude" };
typedef struct _userdata {
char **tags;
int mtag;
int ctag;
} userdata_t;
/* libcurl: write callback (received data from HTTP server) */
static size_t parse_csv(void *buffer, size_t size, size_t nmemb,
void *data)
{
userdata_t *ud = (userdata_t *)data;
size_t realsize = size * nmemb;
size_t p;
char *cbuffer, *token_start, *token_end, *t;
cbuffer = (char *)buffer;
token_start = cbuffer;
p=0;
while (p < realsize && ud->ctag <= ud->mtag) {
if (cbuffer[p] == ',') {
token_end = cbuffer + p-1;
if (token_start < token_end) {
printf("%-12s : ", ud->tags[ud->ctag]);
for (t=token_start; t<=token_end; t++)
putchar(*t);
putchar('\n');
}
ud->ctag++;
token_start = cbuffer + p + 1;
}
p++;
}
return realsize;
}
int main(int argc, char *argv[])
{
CURL *curl;
CURLcode res;
userdata_t ud;
char http_req[128];
/* check args */
if (argc != 2) {
printf("Usage: %s <IP>\n", argv[0]);
exit(EXIT_FAILURE);
}
/* init user data struct */
ud.tags = geoip_tags;
ud.mtag = sizeof(geoip_tags) / sizeof(char *) - 1;
ud.ctag = 0;
/* init libcurl */
if ((curl = curl_easy_init()) != NULL) {
strcpy(http_req, WEBURL);
strcat(http_req, argv[1]);
curl_easy_setopt(curl, CURLOPT_URL, http_req);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, parse_csv);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ud);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
}
else {
fprintf(stderr, "Cannot initialize curl lib.\n");
exit(EXIT_FAILURE);
}
/* Perform the request, res will get the return code */
if ((res = curl_easy_perform(curl)) != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
curl_easy_cleanup(curl);
return 0;
}
