PDA

View Full Version : [C++] get ip address


athebustop
02-07-2004, 14:13
Esiste una funzione in C++ che mi da una stringa contenente l'indirizzo IP del computer su cui faccio girare il programma?

grazie, ciao

cavay
02-07-2004, 20:16
Non esiste ma...non avrebbe nemmeno senso...
se ci pensi su di un computer potresti avere + interfaccie di rete con altrettanti ind IP.

Ma...a cosa ti serve questa informazione?

athebustop
03-07-2004, 18:35
mi serve in un programma che ho fatto che apre un socket e ascolta su una porta per richieste di vario tipo..

per lanciare il programma ho bisogno di dargli come argomento l'indirizzo IP al quale appendere la socket..

Es: nomefile.exe 10.1.2.25

so che in win2000 con la parola echo %COMPUTERNAME% si può ottenere il nome del computer.. magari poi con una qualche funzione si può trasformare in nome in indirizzo IP, un po' quello che succede in un server DNS..

comunque se non è possibile poco male visto che immettere un argomento in più nella funzione non mi costa niente..

grazie

cavay
04-07-2004, 13:26
Allora ti riporto una serie di primitive che possono tornarti utili:

gethostbyname()
dato un hostname, restituisce una struttura dati che
specifica anche i suoi indirizzi IP

gethostbyaddr()
dato un indirizzo IP, restituisce una struttura dati che
specifica anche il suo hostname

getservbyname()
dato un nome di servizio e di protocollo, restituisce una
struttura dati che specifica i suoi nomi e l’indirizzo di porta

gethostname()/getdomainname()
restituiscono l’hostname della macchina

la primitiva che ti serve è la prima....ti riporto un es d'uso...faccio un copia e incolla di alcune parti di un vecchio programmino fato all'univ.

.......
struct hostent *gethostbyname(const char *name);
struct hostent {
char *h_name; // nome ufficiale dell’host
char **h_aliases; // array di alias
int h_addrtype; // Tipo di ind. da restituire; spesso AF_INET
int h_length; // lunghezza in byte dell’indirizzo
char **h_addr_list;// array di ind che sono in Network Byte Order
};
#define h_addr h_addr_list[0] // primo ind. di h_addr_list
h_addr contiene l’indirizzo IP dell’host
h_length contiene la lunghezza dell’indirizzo

......

extern int h_errno;
int main(int argc,char **argv) {
int x, x2;
struct hostent *hp;
for (x=1; x<argc; ++x) { /* ric host name : */
hp = gethostbyname(argv[x]);
if (!hp) {
fprintf(stderr, "%s: host '%s'\n",
hstrerror(h_errno),
argv[x]);
continue;
}


... /* Report delle info trovate: */
printf("Host %s :\n",argv[x]);
printf(" Officially:\t%s\n", hp->h_name);
fputs(" Aliases:\t",stdout);
for(x2=0; hp->h_aliases[x2]; ++x2 ) {
if (x2) fputs(", ",stdout);
fputs(hp->h_aliases[x2],stdout);
}
fputc('\n',stdout);
if (hp->h_addrtype==AF_INET) {
printf(" Type:\t\tAF_INET\n");
if ( hp->h_addrtype == AF_INET ) {
for (x2=0; hp->h_addr_list[x2]; ++x2 )
printf(" Address:\t%s\n",
inet_ntoa(*(struct in_addr *)hp->h_addr_list[x2]));
}
putchar('\n');
}
}
}



il programma funzionava cos'

$ ./exeguibile www.yahoo.com www.redhat.com

output:

Host www.yahoo.com :
Officially: www.yahoo.akadns.net
Aliases: www.yahoo.com
Type: AF_INET
Address: 64.58.76.222
Address: 64.58.76.223
Address: 64.58.76.224
Address: 64.58.76.225
[…..]
Host www.redhat.com :
Officially: www.redhat.com
Aliases:
Type: AF_INET
Address: 66.187.232.56