7) Come avviene la comunicazione connection oriented (socket stream)?
Connessione tra processo client e processo server:
il client ed il server devono creare ciascuno una socket e definirne l’indirizzo (primitive socket e bind)
deve essere creata la connessione (circuito virtuale) tra le due socket
il server definisce una coda di richieste di connessione (coda d’ascolto)…
error=listen(sd,dim);/*crea una coda associata alla*/
int error,sd,dim; /*socket sd, con dim elementi*/
…ed attende richieste di connessione
for(;;){ /*si comporta come un daemon*/
nuovo_sd=accept(sd,&ind,&lun); /*sospende il server fino ad una*/
int nuovo_sd,sd,*lun; /*qualsiasi(no filtro!) richiesta di connessione */
struct sockaddr_in *ind; /*alla socket sd. Quando arriva, crea la socket di */
/*lavoro nuovo_sd, restituendo l’indirizzo della socket del cliente tramite ind e lun*/
fork(); /*uso nuovo_sd, che nel figlio viene duplicato*/
un client richiede la connessione al server
error=connect(sd,&ind,lun); /*richiede la connessione fra socket locale*/
int error,sd,dim; /*sd e socket remota il cui indirizzo è nella struttura puntata*/
struct sockaddr_in *ind;/* da ind e la cui lunghezza è lun*/
il server accetta la richiesta e può iniziare la comunicazione (con read/write o send/recv)
cont=send(sd,buf,lun,flags); /*buf punta ad un buffer lungo lun da cui*/
cont=recv(sd,buf,lun,flags); /*prelevare od inserire il messaggio */
al termine solitamente il server chiude la comunicazione e si rimette in attesa
shutdown(sd,n);} /*chiusura in:n=0 ricezione, n=1 spedizione (il processo collegato riceve un EOF) ,n=2 entrambi;Termine ciclo for */
mentre il client elimina la socket
close(sd); /*eliminazione*/
Schema:
SERVER
|
CLIENT
|
socket()
|
socket()
|
bind()
|
bind()
|
listen()
|
|
accept()
|
|
<ATTESA>
|
<= connect()
|
read()
|
<= write()
|
<ELABORA>
|
|
write()
|
=> read()
|
shutdown()
|
close()
|