====== Una funzione per conoscere il nostro ip pubblico ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//28/06/2012//** \\ \\ La funzione in questione (interamente scritta in Posix) interroga un webserver e si fa restituire il nostro ip pubblico facendo uso dei socket. char* GetPublicIp() **restituisce un array di caratteri (stringa) contenente il nostro ip pubblico ** o in caso d'errore **NULL** ===== Il sorgente ===== **get-public-ip.c** #include #include #include #include #include #include #include #include char* GetPublicIp() ; char* keyread(char *path, char* key); /* * GetPublicIp() restituisce il nostro ip PUBBLICO che effettua le connessioni verso internet oppure ritorna NULL * Keyread() ,usata da GetPublicIp() , filtra l'indirizzo ip dalla risposta del webserver * la pagina index.php รจ costituita dal seguente codice */ char* GetPublicIp() { /*Cambiare se serve*/ const unsigned short port = 80; const char* indirizzo_server="62.149.140.82"; const char* request="GET /myip/index.php HTTP/1.1\r\nHost: www.freemedialab.org\r\n\r\nAccept: text/plain\r\n\r\n"; char* temp="/tmp/temp.tmp"; /*----------*/ #define MAX 1024 int sd; struct sockaddr_in client; struct hostent *hp; char buff[MAX]; char risp[MAX]; /* Dobbiamo riempire la struttura client ma prima * ci occorrono alcune * informazioni che ricaviamo appoggiandoci * alla struttura hp */ hp = gethostbyname(indirizzo_server); bzero(&client, sizeof(client)); client.sin_family = AF_INET; client.sin_port = htons(port); client.sin_addr.s_addr =((struct in_addr*)(hp->h_addr))->s_addr; /* Creiamo il socket */ if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) printf("Errore nella creazione del socket!\n"); /* connettiamoci all'host */ if (connect(sd, (struct sockaddr *)&client, sizeof(client)) < 0){ return NULL; } /*Spediamo la richiesta http*/ sprintf(buff,"%s", request); send(sd, buff, sizeof(buff), MSG_WAITALL); /*Riceviamo la risposta http*/ recv(sd, buff, sizeof(buff), MSG_WAITALL); sprintf(risp, "%s",buff); close(sd); /*Metto la risposta in un file*/ FILE *f=fopen(temp, "w"); fprintf(f, "%s",risp); fclose(f); /*Filtriamo il solo ip dal file*/ char* ip; ip=keyread(temp, "IP"); unlink(temp); /*Ritorniamo il valore dell'Ip*/ return ip; } char* keyread(char *path, char* key) { #define MAXKEY 50 #define MAXVALUE 50 #define MAXLINE 256 FILE *f=fopen(path, "r"); char valuetmp[MAXVALUE], line[MAXVALUE+MAXKEY], *value, key_now[MAXKEY] ; int i; while (feof(f)==0){ fgets(line,MAXVALUE+MAXKEY,f); if (line[0]=='I' && line[1]=='P'){ sscanf(line, "%s %s\n",key_now, valuetmp); if (strcmp(key_now, key)==0){ value=malloc(sizeof(valuetmp)); strcpy(value,valuetmp); return value; } } } fclose(f); } int main (int argc, char *argv[]) { if (GetPublicIp()!=NULL) printf("%s\n",GetPublicIp()); else printf("Problemi di connessione\n"); return 0; } **index.php** ===== Il makefile ===== CPP = gcc all: $(CPP) get-public-ip.c -o get-public-ip clean: rm get-public-ip ====== Versione glib/GIO ====== Di seguito la versione glib/GIO di **get-public-ip** . **get-public-ip.c** #include #include #include #include void GetFile() { //Una varibile per gli eventuali errori GError *error=NULL; // Scarico il file index.php con le informazioni che ci interessano //Uri del Gfile sorgente(mySRC) e uri del Gfile di destinazione (myDEST) GFile* mySRC = g_file_new_for_uri("http://www.freemedialab.org/myip/index.php"); GFile* myDEST = g_file_new_for_uri("file:///tmp/myip.txt"); //Copio il file con questa semplice funzione g_file_copy (mySRC, myDEST, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error); //Verifico se ci sono stati errori e stampo dei messaggi if (error!=NULL) { g_error("Attenzione errore nella copia: %s\n",error->message); exit(-1) ; } } char* GetKey(gchar* group ,gchar* key) { //Una varibile per gli eventuali errori GError *error=NULL; //Scarico il file con le nostre informazioni GetFile(); //Mi preparo a leggere il file con le chiavi GKeyFile * mykey = g_key_file_new(); g_key_file_load_from_file (mykey, "/tmp/myip.txt", G_KEY_FILE_KEEP_COMMENTS, &error); gchar* myval= g_key_file_get_value (mykey, group, key, &error); g_key_file_free (mykey); //Gestisco eventuali errori di lettura if (error!=NULL) { g_error("Attenzione errore nella lettura : %s\n",error->message); return NULL; } return myval; } int main (int argc, char *argv[]) { //Inizializzo i tipi di glib g_type_init(); g_print("%s\n",GetKey("Connessione","IP")); g_print("%s\n",GetKey("Connessione","HTTP_USER_AGENT")); return 0; } **index.php** ===== Il makefile ===== CPP = gcc OPTS = `pkg-config --cflags --libs gio-2.0` all: $(CPP) get-public-ip.c -o get-public-ip $(OPTS) clean: rm get-public-ip