No, la domanda non e` affatto stupida, anzi!
Anche perche` non e` neanche molto scontata la risposta.
Cmq su Linux/Unix puoi agire elencando tutte le interfacce di rete attive e non. Questo codice e` un modo per farlo, e salta volutamente il loopback (127.0.0.1):
codice:
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netdb.h>
int main( int argc, char* argv[] )
{
struct ifconf ifc;
struct ifreq* ifr_array;
struct sockaddr_in* sin;
char buf[ 8192 ];
int s, i, length;
/* apre un socket ausiliario */
s = socket( PF_INET, SOCK_STREAM, 0 );
ifc.ifc_len = sizeof( buf );
ifc.ifc_buf = buf;
/* preleva le informazioni sulle interfacce di rete */
if( ioctl( s, SIOCGIFCONF, ( char* ) &ifc ) < 0 )
{
perror( "Errore su ifc.\n" );
exit( 1 );
}
/* salva il puntatore all`array di strutture */
ifr_array = ifc.ifc_req;
/* numero totale di strutture restituite */
length = ifc.ifc_len / sizeof( struct ifreq );
for( i = 0; i < length; ++i )
{
struct ifreq* ifr = &ifr_array[ i ];
/* elenca solo la famiglia di indirizzi Internet */
if( ifr->ifr_addr.sa_family != AF_INET )
continue;
/* ottiene informazioni sull`interfaccia corrente */
if( ioctl( s, SIOCGIFFLAGS, ( char* ) ifr ) < 0 )
{
perror( "Errore su ifr.\n" );
exit( 1 );
}
/* ignora l`interfaccia di loopback (127.0.0.1) */
if( ifr->ifr_flags & IFF_LOOPBACK )
continue;
/* forza un cast a sockaddr_in delle informazioni sull`indirizzo dell`interfaccia */
sin = ( struct sockaddr_in* ) &ifr->ifr_addr;
/* stampa il nome dell`interfaccia e il corrispondente indirizzo IP */
printf( "%s: %s\n", ifr->ifr_name, inet_ntoa( sin->sin_addr ) );
}
return 0;
}
Per Windows per fortuna il codice e` quasi identico, perche` in fondo ci si basa sulla stessa procedura anche se ovviamente con chiamate diverse ("ovviamente" perche` tanto non c`e` cosa che la Microsoft non si ostini a fare in modo diverso dal MONDO).
Guardare per credere: http://tangentsoft.net/wskfaq/examples/getifaces.html
Ciao.