Newsgroup: it.comp.os.linux.development
Titolo: Ottenere TUTTI gli indirizzi IP di una macchina

Partendo da una situazione del tipo:
eth0      Link encap:Ethernet  HWaddr 00:02:44:32:87:33
           inet addr:192.168.8.40  Bcast:192.168.8.255  Mask:255.255.255.0
eth0:0    Link encap:Ethernet  HWaddr 00:02:44:32:87:33
           inet addr:192.168.8.150  Bcast:192.168.8.255  Mask:255.255.255.0
eth1      Link encap:Ethernet  HWaddr 00:09:1D:00:8A:6A
           inet addr:192.168.8.151  Bcast:192.168.8.255  Mask:255.255.255.0
lo        Link encap:Local Loopback
           inet addr:127.0.0.1  Mask:255.0.0.0
.... vorrei fare una funzione che mi restituisca una lista con tutti gli 
indirizzi IP della macchina, ho provato cosi':
     char ac[128];
     struct hostent *phe;
     if (gethostname(ac, sizeof(ac))) {
         return NULL;
     }
	if ((phe = gethostbyname(ac) )== 0) {
         return NULL;
     }
     for (i = 0; phe->h_addr_list[i] != 0; ++i) {
	// popolo la mia lista di indirizzi
     }
... ma mi da solo il primo degli indirizzi (forse perche' all'entry del 
DNS corrisponde solo il primo indirizzo), ho cercato un po' con google 
con poca fortuna, qualcuno sa indirizzarmi sulla giusta strada?
Ciao,
  Gabry

 indirizzi IP della macchina, ho provato cosi':
...
fd = fopen("/proc/net/arp","r")
while(!feof(fd))
	..
	..
	..
:)
l'unica interfaccia cche non recuperi è la 127.0.0.1

 
Non mi pare funzioni, mi da una serie di indirizzi diversi dal mio :)
cat /proc/net/arp
IP address       HW type     Flags       HW address            Mask 
Device
192.168.8.31     0x1         0x2         00:13:46:71:FE:6A     *        eth0
192.168.8.34     0x1         0x2         00:0E:A6:2A:E6:53     *        eth0
192.168.8.18     0x1         0x2         00:11:D8:71:F5:00     *        eth0
192.168.8.254    0x1         0x2         00:50:FC:88:C0:6E     *        eth0
Probabilmente le macchine verso le quali ho delle connessioni attive al 
momento...

   Gabry
Prova ad aprire un socket qualsiasi su ANY_ADDR e poi ricavare con uso
opportuno di ioctl sul socket descriptor restituito, IP e NETMASK.
ioctl con argomenti SIOCGIFCONF, SIOCGIFADDR, SIOCGIFNETMASK ....
Non ho esempi pronti ma se cerchi con google magari trovi.
una sbirciatina a
strace ifconfig
rivela molti "segreti" :)
Ciao
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 rivela molti "segreti" :)
E` un ottimo consiglio.  strace e` uno degli strumenti piu` utili sotto
Linux (e BSD) - ti permette di vedere come funzionano tante cose.
-- 
David N. Welton
- 
http://www.dedasys.com/davidw/
Linux, Open Source Consulting
- 
http://www.dedasys.com/

 ioctl con argomenti SIOCGIFCONF, SIOCGIFADDR, SIOCGIFNETMASK ....
Googlando questi e con l'aiuto del codice di ifconfig ho realizzato una 
soluzione al problema, la posto nel gruppo se servisse a qualcuno :)
GList *get_local_addresses()
{
     GList *l = NULL;
     struct ifconf ifc;
     struct ifreq *ifr;
     int numreqs = 30, n;
     int skfd = socket(AF_INET, SOCK_STREAM, 0);
     ifc.ifc_buf = NULL;
     for (;;) {
         ifc.ifc_len = sizeof(struct ifreq) * numreqs;
         ifc.ifc_buf = realloc(ifc.ifc_buf, ifc.ifc_len);
         if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) {
             perror("SIOCGIFCONF");
             close(skfd);
             free(ifc.ifc_buf);
             return NULL;
         }
         if (ifc.ifc_len == sizeof(struct ifreq) * numreqs) {
             /* assume it overflowed and try again */
             numreqs += 10;
             continue;
         }
         break;
     }
     ifr = ifc.ifc_req;
     for (n = 0; n < ifc.ifc_len; n += sizeof(struct ifreq)) {
         ifr->ifr_addr.sa_family = AF_INET;
         ioctl(skfd, SIOCGIFADDR, ifr);
         const char *ip = inet_ntoa( ((struct sockaddr_in 
*)&(ifr->ifr_addr))->sin_addr );
         if (strcmp(ip, "127.0.0.1"))
             l = g_list_append(l, strdup(ip));
         printf("Found address: %s\n", ip);
         ifr++;
     }
     free(ifc.ifc_buf);
     close(skfd);
     return l;
}

              l = g_list_append(l, strdup(ip));
hint gratuita: usa g_list_prepend() e poi ritorna la lista invertita
usando g_list_reverse().  l'append si "cammina" tutta la lista per
arrivare al fondo, mentre il prepend è sempre a tempo costante.
ciao,
 Emmanuele.