====== Ottenere il nostro ip privato usato per le connessioni remote ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//8/12/2010//** \\ \\
Puo' essere utile ,in certi casi, conoscere l' indirizzo ip privato usato per le nostre connessioni remote. Di seguito la funzione ''GetLocalIp()'' mostrera' come fare ad ottenerlo.
char* GetLocalIp()
Restituisce l'ip privato usato per le connessioni remote sottoforma di stringa oppure NULL in caso di fallimento.
===== Il codice =====
La funzione si connette tramite socket UDP a un DNS server (quello di google in questo caso) e poi preleva dalle strutture usate per il socket l'indirizzo privato del client (noi). \\ \\
**get-local-ip.c**
#include
#include
#include
#include
#include
#include
#include
#include
/*Ritorna l'indirizzo locale usato per le connessioni all'esterno e NULL se fallisce*/
char* GetLocalIp()
{
/*Modificare per cambiare DNS server*/
unsigned short port = 53;
const char* GoogleDnsIp = "8.8.8.8";
/*Riempo le strutture dati per il server DNS*/
int sd;
struct sockaddr_in server;
struct hostent *hp;
hp = gethostbyname(GoogleDnsIp);
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr =((struct in_addr*)(hp->h_addr))->s_addr;
/*Riempo le strutture dati per il client*/
struct sockaddr_in client;
struct hostent *cp;
cp = gethostbyname("127.0.0.1");
bzero(&client, sizeof(client));
client.sin_family = AF_INET;
client.sin_port = htons(port);
client.sin_addr.s_addr =((struct in_addr*)(cp->h_addr))->s_addr;
/* Creo il socket */
if((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
printf("Errore nella creazione del socket!\n");
return NULL;
}
/* connettiamoci all'host */
if (connect(sd, (struct sockaddr *)&server, sizeof(server)) < 0)
{
printf("Errore di connessione!\n");
return NULL;
}
/*Individuo il mio indirizzo ip pubblico*/
socklen_t* clientlen = (socklen_t* )sizeof(client);
getsockname(sd, (struct sockaddr *) &client, (socklen_t*) &clientlen);
/*Lo converto in stringa e lo scrivo sulla variabile*/
char* MyLocalAddress=malloc(sizeof(20));
inet_ntop(AF_INET, &client.sin_addr.s_addr, MyLocalAddress, 20);
/*Chiudiamo il socket*/
close(sd);
return MyLocalAddress;
}
int
main (int argc, char *argv[])
{
printf("%s\n",GetLocalIp());
return 0;
}
Per la compilazione basta :
gcc get-local-ip.c -o get-local-ip