Newsgroup: it.comp.os.linux.development
Titolo: Recuperare indirizzo IP da www.myip.com

Sto cercando di recuperare il mio IP da 
www.myip.com
con i socket unix. Il problema che il programma si impalla
dopo la send quando chiedo i dati con recv:
void GetLocal_IP()
{
        //
http://www.myip.com
 = 206.165.128.2
        char IP_Buffer[120];
        int Proxy_port = 80;
        int URL_Socket;//Proxy_Connect_Socket;
        struct sockaddr_in Proxy_Dest_Addr;
        URL_Socket = socket (AF_INET, SOCK_STREAM, 0);
        Proxy_Dest_Addr.sin_family = AF_INET;
        Proxy_Dest_Addr.sin_addr.s_addr = inet_addr( "206.165.128.2" );
        Proxy_Dest_Addr.sin_port = htons(Proxy_port);
        memset (&(Proxy_Dest_Addr.sin_zero), '\0',8);
        if (::connect (URL_Socket, (struct sockaddr *)&Proxy_Dest_Addr,
sizeof(struct sockaddr)) == -1)
        {
                kdDebug(0) << "Connect Error: " << strerror(errno) << endl;
        } else {
                        kdDebug(0) << "Connected !" << endl;
                }
        const char *Give_ip = "GET / HTTP/1.0\r\nHost: 
www.myip.com
\r\nUser-Agent:
Mizio " VERSION "\r\nConnection: keep-alive\r\n\r\n";
        if (::send ( URL_Socket , Give_ip , sizeof(Give_ip) , 0) == -1)
        {
                kdDebug(0) << "Send Error: " << strerror(errno) << endl;
        } else {
                kdDebug(0) << "Send OK !" << endl;
                }
 
        if (recv ( URL_Socket, IP_Buffer, sizeof(IP_Buffer) , 0) == -1)
        {
                kdDebug(0) << "recv Error: " << strerror(errno) << endl;
        } else {
                kdDebug(0) << "recv OK !!" << endl;
                }
        kdDebug(0) << IP_Buffer << endl;
        close (URL_Socket);
        //struct sockaddr_in my_addr;
        //get_myaddress(&my_addr);
        //Local_IP = inet_ntoa(my_addr.sin_addr);
}
Non fate caso alla serie di if a vanvera.
Mi date una mano ?
-- 
Bye,
Colossus

 Non fate caso alla serie di if a vanvera. Mi date una mano ?
a prima vista qui cè un errore:
sizeof(Give_ip) vale 4 (visto che è un puntatore) quindi invii al server
solamente qualcosa tipo "GET ", e lui stà li ad aspettare. Controlla
quanto ritorna la chiamata send e ti accorgerai che non è quanto tu
volevi. (puoi usare strlen() per conoscere quanto è grande Give_ip). Un
consiglio che ti do è in questi casi di usare "Connection: close"
anziché "keep-alive", visto che la seconda potrebbe farti perdere qualche
secondo se tu fossi in attesa che la connessione sia chiusa dal server per
renderti conto che la pagina è stata trasferita completamente.
Una mia curiosità. Lo fai per esercizio vero ? ci sono altri modi piu
semplici per conoscere il proprio indirizzo ip :P
Ciao
Matic

 semplici per conoscere il proprio indirizzo ip :P
Veramente non per esercizio. Sto sviluppando un proxy hunter con GUI: 
http://mizio.sourceforge.net
su un forum mi hanno detto di non usare:
struct sockaddr_in my_addr;
get_myaddress(&my_addr);
Local_IP = inet_ntoa(my_addr.sin_addr);
perchè dietro un router non da l'indirizzo del PC ma del router. Così sto
cercando di recuperare l'indirizzo IP da uno di quei siti fatti apposta.
Se puoi mi farebbe piacere che tu compilassi Mizio e mi daresti il tuo
parere, ma vacci piano questo è il mio primo programma in C++ e il mio
primo tentativo di programmazione con i socket !
Grazie per la risposta,
-- 
Bye,
Colossus

Colossus wrote:

Io userei le libcurl meno didattiche ma gia' belle che confezionate :) .
Ciao
        Luca
-- 
<<>><<>><<>><<>><<>><<>><<<>><<>><<>><<
Luca Paredi
Computing technical supporter              
Universita' degli Studi dell'Insubria  
<<>><<>><<>><<>><<>><<>><<<>><<>><<>><<

 Io userei le libcurl meno didattiche ma gia' belle che confezionate :) .
Grazie ma non voglio far dipendere il programma da librerie inutili in
questo caso. L'IP posso prenderlo facendo una query ai vari siti fatti
apposta per questo con dei normalissimi unix socket.
-- 
Bye,
Colossus

 cercando di recuperare l'indirizzo IP da uno di quei siti fatti apposta.
se vuoi fare un programma "serio" la tua scelta mi sembra un terribile
work-around. Che succede se 
www.myip.com
 è giu è non raggiungibile
etc..etc.., o semplicemente se è lento ? Ti pare possibile che non ci
sia un modo per sapere il proprio indirizzo senza andarlo a chiedere a
qualcun'altro ?
Lascia che ti posti questo esempio per trovare _GLI_INDIRIZZI_ locali:
<CODE>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>
#include <errno.h>
#include <arpa/inet.h>
#include <net/if.h>
int main(int argc, char * argv[] )
{
        int     s,i,*x;
        struct  ifconf p;
        struct  ifreq * r;
        struct  in_addr z;
        p . ifc_buf = malloc( 1024 );
        p . ifc_len = 1024;
        s = socket( AF_INET, SOCK_DGRAM, 0 );
        ioctl( s, SIOCGIFCONF, &p );
        r = (struct ifreq *)p . ifc_buf;
        for( i = 0; i < p.ifc_len / sizeof( struct ifreq); i++ )
        {
                printf("%7s ", r -> ifr_name );
                ioctl( s, SIOCGIFADDR, r );
                x = (int *)&r -> ifr_addr;
                z.s_addr = x[1];
                printf("%16s ", inet_ntoa( z ));
                ioctl( s , SIOCGIFNETMASK, r );
                x = (int *)&r -> ifr_netmask;
                z.s_addr = x[1];
                printf("%16s\n", inet_ntoa( z ));
                r++;
        }
        close( s );
        free( p . ifc_buf );
        return 0;
}
</CODE>
Mancano i controlli sugli errori delle funzioni per motivi di velocità di
scrittura (è solo un esempio) e mancano i commenti per fartelo studiare
piu a fondo :P. La risposta sembrerebbe essere.. lavora di ioctl()
Ciao
Matic

 Lascia che ti posti questo esempio per trovare _GLI_INDIRIZZI_ locali:
Porc ! Ci avessi capito qualcosa ! Senti ma quel pezzo di codice
prende l'IP anche se sono dietro un router, firewall ecc ecc ?
-- 
Bye,
Colossus

 
Rispondo io, no. Nel caso mi collegassi ad un router per collegarmi ad
Internet il PC conoscerebbe solo l'ip del router e non l'ip col quale il
router mi collega ad internet che è quello che mi serve per verificare
l'anonimato dei proxies. Comunque grazie per le risposte.
-- 
Bye,
Colossus