Applicativi senza Connessione
Gli applicativi che non intendono usare TCP ma il servizio UDP
di Datagrammi Utente, senza connessione, devono entrambi
aprire un socket di tipo SOCK_DGRAM.
A questo punto gli applicativi hanno a disposizione un numero di
coppie di funzioni di comunicazione, tutte orientate
allo smistamento di messaggi 'atomici' ovvero singoli:
- sendto() e recvfrom()
- send() e recv()
- sendmsg() e recvmsg()
rc = sendto ( sd, buffer, lung, flags, to, indirlung );
rc = recvfrom ( sd, buffer, lung , flags , from, indirlung );
Si ha:
- sd e' il socket aperto in precedenza
- buffer e' l'indirizzo di un buffer di byte in memoria che,
nel caso di invio contiene il messaggio da inviare, e nel caso di
ricezione e' dove viene copiato il messaggio ricevuto dal socket
- lungh e' la lunghezza del buffer, in caso di invio del
messaggio da inviare, in caso di ricezione la lunghezza massima del
messaggio che puo' essere ricevuto
- flags sono vari flag di opzione settabili, e viene lasciato
a zero se non vi sono opzioni
- to e' l'indirizzo dell'identificativo del socket
del destinatario
- from e' l'indirizzo dell'identificativo del socket
del mittente
- indirlung e' la lunghezza del relativo identificativo del socket
Per poter usare queste funzioni entrambi i corrispondenti devono
prima aprire un socket con la chiamata socket, poi
assegnargli un identificativo con la chiamata bind.
Naturalmente ogni corrispondente deve conoscere l'identificativo dell'altro.
Questo identificativo puo' essere una semplice stringa per il dominio
UNIX, ed e' una struttura complessa per il dominio Internet.
rc = send ( sd, msgbuf, lung, flags );
rc = recv ( sd, msgbuf, lung, flags );
Ove:
- sd e' l'identificativo del socket aperto in precedenza
- msgbuf e' l'indirizzo di un buffer in menoria che,
nel caso di invio contiene il messaggio da inviare, nel caso di
ricezione e' dove viene copiato il messaggio
proveniente dal socket
- lung e' la lunghezza del buffer, in invio la lunghezza
del messaggio in partenza, in ricezione la lunghezza massima
del buffer di ricezione
- flags contiene eventuali opzioni e lo si puo' settare
a zero per nessuna opzione
- rc e' il numero di bytes effettivamente
spediti o ricevuti
E' da notare che queste funzioni non indicano l'indirizzo del mittente
o della destinazione. Sono funzioni intese per essere usate dopo una
precedente invocazione della funzione connect. Quando questa
funzione nel client viene usata su un socket a datagramma, non
compie l'apertura di un circuito virtuale ma la registrazione degli
indirizzi di partenza e di arrivo per ogni successivo send
o recv. Il server non ha di questi problemi: manda e riceve
sul socket che ha aperto e su cui ha effettuato una bind.
Le ultime due funzioni, sendmsg e recvmsg
sono orientate all'invio e ricezione di un array di datagrammi
e vengono usate molto meno.