8) Come avviene la comunicazione datagram (connectionless)?
La connessione tra processo client e processo server non viene creata:
Il client ed il server devono creare ciascuno una socket e definirne l’indirizzo (primitive socket e bind), formando così le relative half-association.
I processi possono comunicare specificando, per ogni messaggio, la socket dell’interlocutore.
Il server si mette in attesa di un messaggio…
error=recvfrom(sd,msg,lun,flags,mitt,lun_mitt);
/*mitt e lun_mitt specificano l’indirizzo del mittente*/
…che gli viene inviato dal client.
error=sendto(sd,msg,lun,flags,dest,lun_dest);
/*dest e lun_dest specificano l’indirizzo del destinatario*/
dopo l’elaborazione il server spedisce la risposta, che viene ricevuta dal client. Le primitive usate sono sempre sendto e recvfrom.
al termine si elimina la socket
close(sd); /*eliminazione*/
quindi, il processo Client deve conoscere l’indirizzo internet del nodo remoto e la porta del servizio da usare, mentre il processo Server deve conoscere la porta per il servizio da offrire ed assegnare, se occorre, wildcard addresses per l’indirizzo Internet locale.
Schema:
SERVER
|
CLIENT
|
socket()
|
socket()
|
bind()
|
bind()
|
recvfrom()
|
|
<ATTESA>
|
<= sendto()
|
<ELABORA>
|
|
sendto()
|
=> recvfrom()
|
close()
|
close()
|
Note:
Poiché UDP non è affidabile intrinsecamente, per ottenere maggiore affidabilità occorre prevedere una procedura di ritrasmissione nella applicazione.
Per prevenire situazioni di perdita dovute alla trasmissione di molti messaggi, si usano messaggi i più lunghi possibile.