R: [FoLUG] Scambio di informazioni su due PC collegati adinternetcon lo stesso indirizzo IP Privato(192.168.0.100 condue router.

Riccardo Pretolesi - Ufficio Tecnico Elettrico rpretolesi@cepisilos.com
Gio 25 Nov 2004 14:52:29 CET


Innanzi tutto, grazie mille delle preziose informazioni che mi stai/state
dando.
Io ho sviluppato una applicazione di supervisione industriale che
normalmente e' installata su di una rete locale collegata ad internet
tramite un router.
Dalla parte opposta il cliente vorrebbe leggere con una seconda applicazione
alcuni dati da questo PC.
Visto che l'applicazione e' stata sviluppata in c++, volevo usare i socket
ed il c++ per costruire un canale di scambio.
Solo che con le reti non sono ancora molto ferrato e mi sto documentando.


-----Messaggio originale-----
Da: folug-bounces@lists.linux.it
[mailto:folug-bounces@lists.linux.it]Per conto di Ivan
Inviato: giovedì 25 novembre 2004 14.36
A: Forlí Linux User Group
Oggetto: Re: [FoLUG] Scambio di informazioni su due PC collegati
adinternetcon lo stesso indirizzo IP Privato(192.168.0.100 condue
router.


On Thursday 25 November 2004 13:51, Riccardo Pretolesi - Ufficio Tecnico
Elettrico wrote:
> Quindi se ho capito bene, se io ho con il mio PC sono attaccato ad un
> router che ha l'indirizzo 192.168.0.1 il quale e' collegato ad
> internet sull'indirizzo pubblico (che chiedero' all'amministratore di
> rete) xxx.xxx.xxx.xxx, io devo mettermi in ascolto sull'indirizzo
> xxx.xxx.xxx.xxx, pero' lanciando l'applicazione nel mio computer che
> ha l'indirizzo privato 192.168.0.100.(firewall permettendo).
allora, io uso il c e non so quale sia la chiamata di sistema per aprire
una connessione tcp col c++, ma di solito la sequenza e': ( lato
server )

1) crea socket ( s = socket(AF_INET,SOCK_STREAM, 0)  ( SOCK_DGRAM per
connessione udp )
2) bind su un indirizzo ( r = bind(s, (struct sockaddr_in
*)&serv_addr ) )
3) si ascolta il socket ( listen( s, backlog ) )  (tcp)
4) si accettano le connessioni ( ns = accept(args...)) )

ora il punto su cui hai dubbi e' 2) . il binding non si fa sugli
indirizzi dai quali ti aspetti di essere contattato, ma su quello/i
della macchina locale, ossia il loopback, una delle eth, un ppp, o
tutte (INADDR_ANY). la discriminazione dell' ip di chi ti contatta lo
fai fare ad un firewall, ai tcpwrapper, al server _dopo_ che in socket
e' stato creato, e precisamente dopo punto 4), quando la chiamata
accept ti carica la sockaddr_in.sin_addr.s_addr con l' ip del
chiamante: se l' ip non ti gusta, fai lo shutdown del socket,
altrimenti read e write sul socket medesimo.

attenzione inoltre che tu sul sockaddr_in.sin_addr.s_addr avrai l' ip
pubblico del fw, e quindi non puoi sapere se a contattarti dalla rete
remota sia stato il .100 o il .101 o .102

<NON LEGGERE>
il binding della porta fallo solo sul server.
</NON LEGGERE>

> Quindi quando ricevo una richiesta su tale indirizzo, sulla porta da
> me assegnata, posso verificare che l'indirizzo remoto sia quello che
> mi aspetto.
vedi solo l' ip pubblico del fw del client

ma questa app, e' un pezzo client e un pezzo server, o ogni pezzo fa da
entrambi ? pura curiosita', non e' che dei concetti su esposti ti cambi
un gran che

--
  (@_ Ivan Fabris, S. Sofia (FC,it) PowerPC e Debian GNU/linux SID _*)
  //\         www.folug.org    pgp key @ www.keyserver.net         /\\
  V_/_  Socio Fondatore e presidente del Forli' Linux User Group  _\_V

_______________________________________________
FoLUG mailing list
FoLUG@lists.linux.it
http://lists.linux.it/listinfo/folug per cancellarsi dalla lista




Maggiori informazioni sulla lista FoLUG