C :: Aufgabe #141 :: Lösung #1

1 Lösung Lösung öffentlich
#141

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 ;)

#1
vote_ok
von devnull (8870 Punkte) - 31.12.2016 um 23:14 Uhr

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

Quellcode ausblenden C-Code
*******************************
 * 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;
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben