Newsgroup: it.comp.programmare.win32
Titolo: Ottenere l'indirizzo IP di... "me stesso su internet".

Ho scritto un piccolo serverino TCP in C++ Builder 6. L'unica cosa che non
riesco a fare e' ottenere l'indirizzo IP della mia macchina quando sono
connesso a internet.
Ho provato i vari componenti di default, ma quello che ottengo e'
l'indirizzo del localhost quando non e' attivata la rete locale e quello che
mi assegna automaticamente Windows XP quando funziona la rete locale...
Come devo fare?
Grazie.
    Megabob

Se sei in LAN, probabilmente accedi ad internet
tramite un gateway (un computer collegato ad internet che "distribuisce la
connessione" ai pc interni alla lan)
da cui:
1) il tuo computer non ha un indirizzo  IP pubblico su internet (l'unico ad
averlo è il gateway)
2) qualsiasi server fai girare sul tuo pc , non sarà visibile dall'esterno,
ma solo dagli altri computer in LAN
a meno che sul "GATEWAY" non siano specificate delle particolari regole per
cui le connessioni su una determinata porta "del gateway" siano
reindirizzate verso il tuo pc.
Cerco di spiegarmi meglio:
quando sei in lan è come se tu fossi dietro un muro, da una parte ci sono i
pc della lan, in mezzo c'e il computer che è collegato ad internet,
dall'altra c'e' internet.
Chi si trova su internet e guarda dall'esterno la tua lan vede solo
l'indirizzo del pc che è al centro (solitamente un router), e qualsiasi
connessione con un pc interno alla lan è inpossibile a meno che il pc che è
al centro non sia configurato per fare passare il traffico fino al tuo pc.
Mi rendo conto che è un po macchinoso , ma funzia così.
Le cose non sono proprio così ma ho cercato di renderle più semplici
ad ogni modo per chiarirti le idee cerca informazioni su NAT-PAT-FIREWALL.
PS: Se invece già sai tutto su reti lan -nat-pat allora io non ho capito una
cippa della domanda e mi scuso anticipatamente.
Ciao
Lorenzo

Questo e' tutto chiaro, il fatto e' che non c'e' ne' router ne' gateway tra
me e internet.
Il PC e' direttamente collegato tramite un semplicissimo modem 56K e ho un
"piccola rete domestica" costituita dal mio e da un altro PC collegati
tramite un cavo "crossed".
Il problema secondo me e' Windows XP che "filtra" il vero indirizzo IP che
mi viene dato dal provider e mi fa vedere solo quello "virtuale" che ho
sulla LAN locale.
Non so come fare!
L'informazione e' sicuramente disponibile visto che se apro la finestrella
della connessione lo trovo scritto li'! Ovviamente non posso risolvere il
problema "copiandolo" da quella finestrella...
Aiuto...
    Megabob
"Lorenzo" <lcer...@NoSpam--dnsitalia.com> ha scritto nel messaggio
news:S684a.16797$uA5.4...@tornado.fastwebnet.it...


     Megabob
ciao

Questo è normale,
perchè nel tuo caso visto che esiste già una connessione di rete
windows utilizza un sistema di natting per fare convivere
le due connessioni.
prova con  l'api gethostbyname(nomemacchina) per avere la lista degli
indirizzi
questa api ti restituisce una struttura così
struct  hostent {
     char*  h_name;
     char** h_aliases;
     int    h_addrtype;
     int    h_length;
     char** h_addr_list; //lista di tutti gli indirizzi
};
ciao
Lorenzo

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/win
sock/gethostbyname_2.asp
ciao
lorenzo

Ho risolto. Mi sono accorto che nelle connessioni di rete avevo anche un
"Bridge di rete" che mi si era installato quando provai ad usare la
condivisione della connessione.
Disabilitandolo mi ritorna l'indirizzo IP che ho su internet.
Grazie a tutti per l'aiuto.
    Megabob
"Lorenzo" <lcer...@NoSpam--dnsitalia.com> ha scritto nel messaggio
news:8j94a.16908$uA5.4...@tornado.fastwebnet.it...


 ma solo dagli altri computer in LAN
Una piccola puntualizzazione: cio` che dici e` vero soltanto se il
router e` di tipo NAT. Esistono un sacco di reti locali (specialmente
quelle di aziende medio-grandi o di universita`) che hanno registrato un
range di indirizzi IP, e in tal caso e` perfettamente lecito usare i
router in modo "classico" e avere un IP visibile su ogni PC della rete.
--
Lorenzo

Il guaio si e' ripresentato. L'indirizzo giusto me lo da solo se l'altro
computer sulla LAN non e' collegato.
Se invece sulla rete c'e' tale PC, mi restituisce l'indirizzo IP del PC
sulla LAN.
Maledizione.
    Megabob
"Lorenzo Lutti" <lorenz...@DOHtiscalinet.it> ha scritto nel messaggio
news:uVw4a.132476$ZE.37...@twister2.libero.it...


 Maledizione.
Usi qualche programma tipo Firewall o simile?
Questo programma ti dà l'IP corretto?
Sarebbe un primo passo...
Kiuhnm



c'e' un modo semplice e stupido per risolvere il tutto..
senza andare a frugare tra le routing table e le interfacce..
apri un socket qui.. 
http://myip.hn.org/ip.cgi
e becchi subito il tuo ip public... anche se sei nattato..
ciao
 sbirish

 ha scritto nel messaggio
news:v1n55vgbm419ajbc8...@4ax.com...


Si. Ho il Firewall della McAffee. Ora non posso provare a vedere se e' colpa
sua, perche' non mi e' possibile collegare l'altro PC alla rete. Non appena
potro', sperimentero' anche questa e postero' il "risultato"...
Possibile pero' che nessuno abbia pensato ad un componente (o simile) che
sia un po' piu' furbo di quelli di default?!?
    Megabob
"Kiuhnm" <
kiu...@softhome.net
*NOSPAM*> ha scritto nel messaggio
news:zkA4a.268135$AA2.10...@news2.tin.it...


No. Il Firewall non c'entra niente. Ho sempre il solito problema: se il PC
e' attaccato alla rete ho l'IP della LAN stessa e non della connessione ad
internet.
Per essere precisi ho usato i seguenti metodi per ottenere l'IP:
TIdIPWatch::CurrentIP
TServerWinSocket::LocalAddress
Entrambi mi danno lo stesso risultato.
    Megabob
"Megabob" <a@a.a> ha scritto nel messaggio
news:OXH4a.133478$YG2.3...@twister1.libero.it...


    Megabob
pensala cosě:
sei sicuro di avere una interfaccia sola verso l'esterno?
se ne hai piu' di una quale devi usare?
come becchi la route verso un determinato ip?
come fai a scrivere il tutto in modo portabile?
e se sei dietro nat? le tue interfacce non hanno un ip esterno.
alla fine.. in molti casi puoi risolvere con un mero socket..
in modo facilmente portabile ( e risolvi anche in caso di nat ).
ciao
 sbirish

 Lorenzo
Ehm... Mi vergogno un po', ma per le API come questa, in C++ Builder non
esiste documentazione? Di solito la Borland "incapsula" le chiamate
"standard" con oggetti creati ad hoc. Il problema e' che io non so come fare
per sapere quale di questi oggetti faccia riferimento ad una data API.
Se invece volessi usarla "nuda e cruda" come dovrei fare per ottenere
documentazione sulle API stesse che Windows mi mette a disposizione? Anche
perche' immagino che dovrei sapere quali file includere per la compilazione,
no?
    Megabob

 ha scritto nel messaggio
news:qcn65vs470hd7qui8...@4ax.com...

Hai ragione. Il fatto e' che dovevo scrivere questa applicazione per farla
stare su un PC (non mio) di cui gia' conoscevo la configurazione.
Il fatto e' che tra l'altro questo PC e' collegato tramite FastWeb, che
immagino mi avrebbe causato altri problemi, perche' li' mi dava proprio un
indirizzo che iniziava con 23...! Credo che l'HAG immezzo avrebbe generato
altra confusione...
Ora voglio vedere tramite socket cosa posso combinare.
Grazie.
    Megabob

Guarda in MS SDK Help Files e seleziona MAPI programmer ...... Cerca
nell'indice gethostbyname trovi la descrizione. Cmq devi includere
winsock2.h e forse anche windows.h
"Megabob" <a@a.a> ha scritto nel messaggio
news:NaJ4a.134079$ZE.38...@twister2.libero.it...


 altra confusione...
Se puo servire qualche info ,
io lavoro in FASTWEB
ciao
Lorenzo

Entrambi mi danno lo stesso risultato.
Secondo me l'unica è usare un'api che
ti restituisca gli ip su tutte le interfacce di rete.
GetHostByName appunto
Ciao
Lorenzo

Me ne viene un'altra.
ho sviluppato una dll in cpp per interfacciare VB e winpcap
windowspacketcapturelibrary politecnico di torino.
Tramite il suo driver NDIS riesco ad ottenere tutte le interfacce , tutti
gli ip, tutte le netmask
etc etc.
Altrimenti puoi usare proprio la libreria winpcap
google winpcap
Se puo' servire ....mi facci sapere
ciao
Lorenzo



*argh* le winpcap pesano 450k.. ed installano un packet driver
tra l'altro.. per prendere soltanto gli ip delle interfacce
mi sembra overkill..
tanto che se vuoi soltanto gli ip delle interfacce, netmask
e robe simili basta che frughi nel registry...
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
... se fa cosi' ipconfig.. penso possa farlo anche tu.. senza
che qualcuno abbia da ridire..
1952 840 844 NtOpenKey (0x20019, {24, 32, 0x40, 0, 0,
"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{7AA8AEDC-0240-4772-AFEA-14A0BA244595}"},
... 224, ) == 0x0
1953 840 844 NtQueryValueKey (224, "Domain", Partial, 144, ...
TitleIdx=0, Type=1, Data="\0\0"}, 14, ) == 0x0
1954 840 844 NtQueryValueKey (224, "DhcpDomain", Partial, 144, ... )
== STATUS_OBJECT_NAME_NOT_FOUND
.......
ciao
 sbirish

 ha scritto nel messaggio
news:nbh75vcef7s6t8vqt...@4ax.com...


 winsock2.h e forse anche windows.h
Scusa di nuovo l'ignoranza, ma dove lo trovo l'MS SDK? Lo devo installare o
e' gia' dentro? Non lavoro con il Visual Studio, lavoro con il Builder della
Borland.
    Megabob

Quando installi C Builder te lo mette nel menų di avvio. Vai nel menu
selezioni Borland C .... poi Help poi MS SDK .... e poi MAPI ....
"Megabob" <a@a.a> ha scritto nel messaggio
news:nb25a.137798$ZE.39...@twister2.libero.it...


 >


 complicata... 
invece è una cosa *orribilmente* complicata. Ma poi, a che ti serve?
-- 
  < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
      Don't stand, REACT!      version 0.1.0. C, C++ and ASM developers
                               and beta testers are welcome!

 invece è una cosa *orribilmente* complicata. Ma poi, a che ti serve?
Forse con winipcfg.exe di windows millenium risolvi?