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()