%% othersock.tex
%%
%% Copyright (C) 2004 Simone Piccardi.  Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Prefazione",
%% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
%% license is included in the section entitled "GNU Free Documentation
%% License".
%%
\chapter{Gli altri socket più comuni}
\label{cha:other_socket}

Dopo aver trattato in \capref{cha:TCP_socket} i socket TCP, che costituiscono
l'esempio più comune dell'interfaccia dei socket, esamineremo in questo
capitolo gli altri tipi di socket, 


\section{I socket UDP}
\label{sec:UDP_socket}

Dopo i socket TCP i socket più utilizzati nella programmazione di rete sono i
socket UDP; protocolli diffusi come NFS o il DNS usano principalmente questo
tipo di socket. Tratteremo in questa sezione le loro caratteristiche
principali e le modalità per il loro utilizzo.


\subsection{Le caratteristiche di un socket UDP}
\label{sec:UDP_characteristics}

Come illustrato in \secref{sec:net_udp} UDP è un protocollo molto semplice che
non supporta le connessioni e non è affidabile: i dati vengono inviati in
forma di pacchetti, e non ne è assicurata né la effettiva ricezione né
l'odinamento.

Questo significa che a differenza dei socket TCP i socket UDP non supportano
una comunicazione di tipo \textit{stream} in cui si ha a disposizione un
flusso continuo di dati che può essere letto un po' alla volta, ma di tipo
\textit{datagram}, in cui i dati arrivano in singoli blocchi che devono essere
letti integralmente.

Questo diverso comportamento significa anche che i socket UDP, pur restando
nella famiglia \const{PF\_INET}\footnote{o \const{PF\_INET6} qualora si usasse
  invece il protocollo IPv6.} devono essere aperti quando si usa la funzione
\func{socket} (si riveda quanto illustrato a suo tempo in
\tabref{tab:sock_sock_valid_combinations}) utilizzando come valore per il tipo
di socket \const{SOCK\_DGRAM}.

Questa differenza comporta ovviamente il fatto che anche le modalità con cui
si usano i socket UDP sono completamente diverse rispetto ai socket TCP, ed in
particolare non esistendo il concetto di connessione non esiste il meccanismo
del \textit{three way handshake} nè quello di stati del protocollo, in realtà
tutto quello che avviene nella comunicazione attraverso dei socket UDP è la
trasmissione di un pacchetto da un client ad un server o viceversa, secondo lo
schema illustrato in \figref{fig:UDP_packet-exchange}.

\begin{figure}[htb]
  \centering
  \includegraphics[width=10cm]{img/udp_connection}  
  \caption{Lo schema di interscambio dei pacchetti per una comunicazione via
     UDP.}
  \label{fig:UDP_packet-exchange}
\end{figure}

Anche se UDP è completamente diverso rispetto a TCP resta identica 



\subsection{Le funzioni \func{sendto} e \func{recvfrom}}
\label{sec:UDP_sendto_recvfrom}

Come accennato le due funzioni principali usate per la trasmissione di dati
attraverso i socket UDP, ma in generale attraverso qualunque socket che
preveda una comunicazione a pacchetti, sono \func{sendto} e \func{recvfrom}.


\section{I socket \textit{Unix domain}}
\label{sec:UDP_socket}

Benché i socket Unix domain non siano strattamente attinenti alla rete, in
quanto definiscono una interfaccia di comunicazione locale alla singola
macchina, li tratteremo comunque in questa sezione in quanto la loro
interfaccia è comunque basata sulla più generale interfaccia dei socket.




%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "gapil"
%%% End: 
