Newsgroup: it.comp.lang.c
Titolo: connessione a socket

Supponiamo di avere stabilito una consessione tramite socket con la mia
macchina che agisce
come server.
Quando accetto la connessione del client ho un modo per conoscere
l'indirizzo IP dello stesso?
Grazie in ogni caso,
            Stefano
-- 
Posted from 
astmim.merate.mi.astro.it
 [192.167.38.1] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

te lo spedisce lui stesso il proprio IP...
server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=((u_short)PORTA);
Questa e' la parte lato server, con questo codice tu inizializzi le
variabili del tuo server che ti ricordo e' una struct di tipo "sockaddr_in"
il client dalla sua parte e' inizializzato allo stesso modo:
client.sin_family=AF_INET;
client.sin_addr.s_addr=inet_addr(IPADDR);
client.sin_port=((u_short)PORTA);
Quell' INADDR_ANY significa che il tuo server accetta connessioni da
qualunque indirizzo IP, tu semplicemente se vuoi sapere l'IP che ti si e'
collegato gli dici, subito dopo l'esecuzione della accept(), si stampare
quello che si ritrova nella "sezione" server.sin_addr.s_addr della tua
struct cosi' sai chi ti si e' collegato.... se non ricordo male devi fare
una ntohs()[net to host squalcosa] prima in modo da rendere l'indirizzo IP
leggibile alla tua macchina.
Ovviamente l'IPADDR del client si riferisce all'IP del server a cui si vuole
connettere
Ciao
Alamo714

Alamo714 ha scritto:

Ho capito.
E se, per esempio, aprissi la connessione come server ponendo, al posto di
INADDR_ANY l'indirizzo della macchina (supponi sia unica) dalla quale sono
disposto ad accettare conessione potrebbe funzionare?
E' chiaro a questo punto che quello che voglio evitare è di avere connessioni
indesiderate al mio server...
    Stefano


Si,  ma non e' sicuro.
Nel senso che e' il client stesso a fornirti quell'informazione.
Cioe' nel pacchetto tcp/ip che effettua la richiesta di connessione
al tuo server c'e' un intestazione che continene (fra l'altro) l'indirizzo
ip della macchina client. La libreria socket prende quest infornazione
e te la mette nella struttura sock_addr ... come e' stato gia' descritto.
Normalemente al lato client si lascia fare quest'operazione alla libreria
socket e quindi quest' indirizzo e' giusto. Ma si puo' bypassare la
libreria socket e mettere al posto del giusto indirizzo ip  quello che il
pirata vuole.
Nel caso specifico io da un altra macchina (che sia pero' in contatto
diretto con entrambe) potrei far tranquillamente finta di essere il tuo
client. Anche se dovrei conoscere l'indirizzo IP al quale tu garantisci
l'accesso (bastano 253 tentativi variando solo l'ultimo byte).
In definitiva il metodo funzionicchia solo se la persona "pirata" non
ha un minimo di conoscenze tecniche oppure non ha visibilita' ad entrambe
le macchine (questo perche' perderebbe le risposte che da server andrebbero
al client). Su rete a meno di usare crittografia seria (le chiavi PGP vanno
benissimo comunque) non c'e' molta sicurezza.
                                                            Andrea

 e te la mette nella struttura sock_addr ... come e' stato gia' descritto.
Per la sicurezza... beh Zaghi ha ragione, infatti se non sbaglio e' la
procedura chiamata sniffing.... frapporsi in una comunicazione facendo
credere ad un server di essere il client con cui sta comunicando e facendo
credere al client di stare comunicando con il server.... accidenti.. e'
anche detto attacco ManInTheMiddle?(si e' una domanda...)
Cmq sia... non esiste un sistema realmente sicuro, prima o poi si trova
sempre il modo di fregarti la sicurezza...

Grazie a tutti allora.


 
In realtà quando entrano in ballo i processi e in altri utilizzi si usano le
funzioni:
 getpeername(int sockfd, sockaddr *localaddr, socketlen_t *addrlen)
 getsockname(int sockfd, sockaddr *peername, socketlen_t *addrlen)
Questo perchè non è possibile sapre l'ip col metodo illustrato da
Alamo714.
Alberto