Newsgroup: it.comp.programmare.win32
Titolo: trovare l'IP del router

Hello All!
Un PC fa parte di una rete locale e si affaccia ad internet attraverso 
un router.
C'e' modo, in un programma in VC, di stabilire l'IP che il router 
presenta verso l'esterno, vale a dire quello che il provider ha 
assegnato?
Ho un programma in VC6 che usa i socket per trasmettere dati in TCP/IP 
e mi servirebbe questa informazione, sia che si tratti di un vero e 
proprio router che di un PC con installato un server come wingate.
Ciao e grazie!
Alessandro


Potresti inviare un pacchetto di ping destinato a un qualsiasi IP fuori 
dalla rete locale con TTL (time to live) settato a 1 o 2 e aspettare la 
notifica della "morte" del pacchetto suddetto da parte del router (non sò 
se l'indirizzo esterno viene ritornato dal primo step o dal secondo).
E' il metodo che utilizzano i programmi di trace-route.
Per farlo utilizzando le API "normali" devi installare winsock2 (dovrebbe 
essere installata su tutte le versioni successive a 98 e NT 4), altrimenti 
esistono delle api undocumented (che non ho mai utilizzato e non sò se sono 
supportate da W2k) per inviare i pacchetti ICMP (protocollo cui fa 
riferimento ping, se la memoria e l'odio per gli acronimi non mi 
tradiscono).
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

 assegnato?
Ti so dire soltanto che, a parte il metodo indiretto del ping che ti ha gia`
suggerito Valter, deve esistere per forza anche un modo diretto, anche se io
non lo conosco. Deve esistere per un motivo semplice: il tuo PC deve per
forza "sapere" qual e` il router designato per ogni indirizzo IP in uscita,
altrimenti non saprebbe a chi spedire il pacchetto.
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/

: 

Il PC deve però conoscere solo l'indirizzo "interno" del router, non quello 
che il router presenta all'esterno.



Questo si (in effetti mi interesserebbe anche sapere come rilevare l'IP
"interno" del router), ma come ha detto Valter quello che cerco e` sapere
l'IP che il router presenta all'esterno.
In pratica il problema e` questo: il mio solito esperimento di programma di
chat punto-punto. Dato che non puo` avvalersi di un server, che non saprei
dove mettere, gli utenti "on line" sono rilevati mediante un escamotage: ho
aperto un account a mio nome su libero, con spazio web annesso. La sezione
server del programma, quando lanciato E se la macchina e` connessa ad
internet, ovvero ha un indirizzo che non e` quello di una LAN, esegue un FTP
su tale spazio ed aggiorna un file di testo contenente, su ciascuna riga, il
nickname e l'IP di ciascuno di coloro che hanno una copia del programma in
esecuzione.
L'altra meta` del programma (che comprende sia la sezione server che la
client) legge ad intervalli regolari via HTTP il file, da` un "colpo" sulla
porta 40000 dell'IP che sta provando ed aggiorna una finestrina (CListBox)
che indica gli utenti "vivi". Cliccandoci sopra la sezione client chiama
quella server all'IP indicato, ovvero quello dell'altro utente. Ovviamente
c'e' un meccanismo che previene la lista dal diventare piena di gente che
non e` piu` attiva.
Ed ora il problema: qualche mio amico dovrebbe poterlo usare sotto router.
Dato che la sezione server del mio programma registra sul file di testo (via
FTP) l'IP della macchina su cui gira, finisce col registrare l'IP interno
della LAN. Il mio amico mi dice che, se il programma fosse in grado di
stabilire automaticamente l'IP (statico, nel suo caso) che il router
presenta all'esterno, lui (il mio amico) potrebbe poi "NATtare" il proprio
indirizzo locale per tutto il traffico diretto alla porta 40000. In questo
modo, il mio programma registrerebbe sul server FTP il vero IP della rete e
lui, grazie al NAT, potrebbe ricevere la chiamata su quella porta.
Esistono sistemi piu` semplici? Il massimo sarebbe aggiungere al programma
una finestra "IP" per permettere all'utente di inserire l'IP INTERNO del
router, da usare come proxy, e poi risolvere tutto l'ambaradan... ma come?
Ciao e grazie a tutti e due!
P.S. modifica collaterale: qualcuno sa come stabilire se la macchina ha
accesso ad internet o no, dato che non voglio provocare la comparsa della
finestra "Connetti a..."? Ora eseguo un parse dell'elenco degli IP della
macchina e utilizzo FTP e HTTP solo se pare esserci un indirizzo che non e`
di una LAN, ma e` un sistema che mi fa un po` schifo. In questo modo,
comunque, il programma puo` restare in silenzio senza rompere l'anima con
richieste di connessione e, se la connessione arriva, la utilizza.

 accesso ad internet o no
Ne abbiamo parlato un po' di tempo fa. Per le connessioni tramite Accesso
Remoto basta usare RasEnumConnections() e vedere se c'e` qualche connessione
attiva (e` vero che il RAS si puo` usare anche per connessioni diverse da
quella utente-provider internet, ma e` molto raro); per le reti locali non
esistono metodi infallibili. In generale l'approccio usato da ICQ, ossia
lanciarsi quando viene rilevata una nuova connessione e chiudersi quando non
viene piu` rilevata, e` quello vincente; se sei in una LAN lo lasci sempre
attivo e sei a posto lo stesso.


 se sei in una LAN lo lasci sempre attivo e sei a posto lo stesso.
...previo inserimento di una opzione che permetta all'utente di forzare le
funzionalita` che richiedono internet... diversamente dovrei controllare
l'IP per vedere se puo` suonare come quello di una macchina in una LAN... e
non magari il 127.0.0.1 e forse altri indirizzi come quello... o no?
Ciao e grazie!

 quello... o no?
Beh, semplicemente puoi provare a collegarti (chiamando lo script via HTTP o
in qualsiasi altro modo) e se la connessione ti va in timeout, significa che
Internet non e` disponibile in quel momento. In una LAN la funzione che ti
mostra la finestra di Accesso Remoto quanto tenti la connessione non deve
esserci...
