Newsgroup: it.comp.os.linux.development
Titolo: Ottenere l'indirizzo IP ESTERNO di una macchina

Ho spesso usato per ottenere l'indirizzo IP della macchina su cui sto 
eseguendo un'applicazione la funzione seguente (sia su unix che su 
windows), di recente pero` ho visto che su UBUNTU non funziona perche' 
per qualche strano motivo l'/etc/hosts della macchina viene configurato 
come:
127.0.0.1 localhost
127.0.1.1 nomemacchina
Qualcuno ha una funzione piu` attendibile per ottenere l'indirizzo 
esterno di una macchina? Capisco che il concetto non e` preciso (una 
macchina puo` avere quanti indirizzi esterni vuole), ma a me basta 
ottenerne uno che non sia locale :)
std::string
get_local_address() const
{
     char ac[80];
     if (!gethostname(ac, sizeof(ac))) {
         if (struct hostent *phe = gethostbyname(ac) ) {
             for (int i = 0; phe->h_addr_list[i] != 0; ++i) {
                 in_addr_t addr;
                 memcpy(&addr, phe->h_addr_list[i], sizeof(addr));
                 std::cerr << "Trovato indirizzo " << 
inet_ntoa(*((in_addr *)&addr)) << "\n";
                 if (addr != inet_addr("127.0.0.1")) {
                     char buffer[40];
                     inet_ntop(AF_INET, (void *)&addr, buffer, 
sizeof(buffer));
                     return buffer;
                 }
             }
         }
     }
     return "0.0.0.0";
}

 ottenerne uno che non sia locale :)
ifconfig non va bene? oppure id addr 
Ciao, Micky
-- 
What's this hash prompt on my terminal mean?
Micky Del Favero  -  System Manager  &  BOFH

 esterno di una macchina? 
prova a dare un'occhiata quì, ma non ti garantisco nulla :)
http://en.wikipedia.org/wiki/Getaddrinfo
-- 
SF
Facciamo quello per cui siamo stati addestrati, per cui siamo stati cresciuti, 
per cui siamo nati. Niente prigionieri, nessuna pietà. Inizio memorabile.

Gabriele Greco ha scritto:

Usare dyndns e un client per mantenerti allineato non puň tornare piů 
comodo?

 comodo?
No perche` cosi` otterrei l'indirizzo visibile in rete internet della 
macchina e non quello in rete INTRANET che e` quello che mi interessa, 
tra l'altro l'applicazione ha come location di deployment una intranet 
privata :)
Il problema sembra essere che l'installer di ubuntu (e temo anche altre 
distribuzioni) configurano /etc/hosts cosi`:
gabry@nevada:/tmp/swm$ cat /etc/hosts
127.0.0.1       localhost
127.0.1.1       nevada
Quindi il metodo classico di ottenere prima il nome della macchina e poi 
dal nome l'indirizzo IP non funziona (anche con getaddrinfo, per 
rispondere all'altro post, ottengo lo stesso risultato, 127.0.1.1)
usare una popen su ifconfig potrebbe essere la soluzione, anche se non 
mi piace un granche', l'alternativa e` il parse di 
/etc/network/interfaces (che funziona solo su distro debian based, ma 
sono debian i server su cui l'applicazione girera`...)
Bye,
  Gabry

 sono debian i server su cui l'applicazione girera`...)
Perché non correggi il file '/etc/hosts'?
Se la macchina è connessa in lan e nevada è il nome, la seconda linea 
non va bene.  Al posto di 127.0.1.1 deve esserci l'indirizzo IP 
assegnato alla macchina se è un IP statico oppure nessuna linea se 
viene assegnato un IP dinamicamente.  In questo ultimo caso viene 
interrogato il name server specificato in '/etc/resolv.conf'.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 il name server specificato in '/etc/resolv.conf'.
Beh, io volevo essere piu` a prova di "errore" che potevo, mi rendo 
conto sviluppando da tanti anni su linux che le differenze tra una 
distribuzione e l'altra sono tali che e` difficile purtroppo :)
Basta pensare i casini necessari per far apparire un'applicazione nel 
menu di KDE o Gnome (ed esser retrocompatibile almeno fino al 2002) e i 
disastri delle tre ABI della libstdc++ dello stesso periodo...
Comunque sono abbastanza convinto anch'io che sia il setup di ubuntu a 
realizzare un /etc/hosts errato, quindi terro` il codice originario (che 
fa gethostname() e poi ottiene l'ip) con un fallback per settare l'ip a 
mano come parametro di configurazione nel caso in cui non ci sia l'entry 
in hosts e contemporaneamente non sia presente un nameserver valido in 
resolv.conf
bye,
  Gabry