PDA

Visualizza la versione completa : [C++] Ricavare il proprio IP pubblico


liberopnlug
17-12-2006, 12:44
Salve, sono un programmatore c++..
vorrei sapere se c' qualche funzione c++ per ricavare il proprio ip pubblico..
o se avete idea di come fare in un'altra maniera...

intanto grazie

saluti...

mamo139
17-12-2006, 13:40
int i;
char hname[100];
struct in_addr addr;
struct hostent *ip;
WSADATA wsaData;

WSAStartup(MAKEWORD(1, 1), &wsaData);

gethostname(hname, sizeof(hname));
printf ("Nome host: %s\n\n", hname);

ip = gethostbyname(hname);

printf ("Indirizzi IP:\n");

for (i = 0; ip->h_addr_list[i] != 0; i++)
{
memcpy(&addr, ip->h_addr_list[i], sizeof(struct in_addr));
printf("%d) %s\n", i+1, inet_ntoa(addr));
}

WSACleanup();

liberopnlug
18-12-2006, 09:31
Si grazie infinite...

ma al di l che le parti a cui metto gli asterischi di fianco non mi vanno

int i;
char hname[100];
struct in_addr addr;
struct hostent *ip;
******WSADATA wsaData;

******WSAStartup(MAKEWORD(1, 1), &wsaData);

gethostname(hname, sizeof(hname));
printf ("Nome host: %s\n\n", hname);

ip = gethostbyname(hname);

printf ("Indirizzi IP:\n");

for (i = 0; ip->h_addr_list[i] != 0; i++)
{
memcpy(&addr, ip->h_addr_list[i], sizeof(struct in_addr));
printf("%d) %s\n", i+1, inet_ntoa(addr));
}

******WSACleanup();

Io necessito di uno script per LINUX che mi tropi l'ip pubblico, non quello locale...
questo mi d come risultato solo 127.0.0.1

Habanero
18-12-2006, 14:33
liberopnlug il codice indicato vale per Windows.. per linux dovresti semplicente eliminare le righe incriminate.

Il codice di mamo139 ovviamente enumera unicamente gli ip delle interfacce locali e in nessun modo puo' trovare l'ip pubblico se si dietro un router o generico gateway.

Purtroppo non c' modo semplice... o si trova il modo di interrogare il router (ma qui il codice dipende fortemente dal router usato e quindi non portabile) oppure, meglio, interroghi un server esterno alla rete che ti indichi da quale ip ha ricevuto la richiesta.

oregon
18-12-2006, 14:37
Infatti ... ad esempio interroga il sito

http://www.myip.it/

Ovviamente non e' semplicissimo ...

Habanero
18-12-2006, 14:49
in alternativa all'uso di un server quale quello indicato da Oregon puoi crearti tu il servizio su uno spazio web che supporti un linguaggio server side come PHP (ne esistono di gratuti). La cosa semplicissima.
In questo modo puoi far si che la risposta http del server contenga unicamente l'indirizzo ip e non una pagina complessa come quelle dei servizi gi disponibili sul web. Cos facendo eviti di impazzire con il parsing della pagina che tra l'altro pu essere soggetta a cambiamenti che non sono sotto il tuo controllo.

liberopnlug
18-12-2006, 14:54
Ok ottimo...ma come mi connetto tramite c++ ad una pagina php??
potrei aprire una socket, ma necessario il server abbia una socket aperta...come faccio se no????

comunque io non chiedo modi semplici, dato quello che sto sviluppando non ritengo nulla sia semplice... :fighet:

Habanero
18-12-2006, 14:59
ovviamente ogni server http ascolta sulla porta 80...
ti devi collegare alla porta 80, fare la richiesta http per la pagina in questione (se non sei pratico studia i rudimenti del protocollo http). In risposta ti viene ritornata la pagina contenente header http + contenuto. Il contenuto quello che devi analizzare per ricavare l'ip.

liberopnlug
18-12-2006, 15:05
Quindi se io faccio una paginetta php che cm echo mi d solo l'ip desiderato, analizzando la pagina mi ricavo l'ip...giusto???

Habanero
18-12-2006, 15:10
esattamente... ovviamente il tuo programma C deve fare la giusta richiesta HTTP e deve analizzare una risposta HTTP... quest'ultima non composta solo dall'IP che hai stampato con l'echo ma davanti a tutto presenta gli header http. Non so quanto sei pratico del protocollo... l'ho specificato nel caso non conoscessi la materia. Se ti servono delucidazioni chiedi pure.

Loading