%% License".
%%
-\chapter{Introduzione ai socket}
+\chapter{I socket}
\label{cha:socket_intro}
In questo capitolo inizieremo a spiegare le caratteristiche salienti della
si utilizzerà per la comunicazione. Per evitare un'introduzione puramente
teorica concluderemo il capitolo con un primo esempio di applicazione.
-\section{Una panoramica}
+\section{Introduzione ai socket}
\label{sec:sock_overview}
-Iniziamo con una descrizione essenziale di cosa sono i \textit{socket} e di
-quali sono i concetti fondamentali da tenere presente quando si ha a che fare
-con essi.
+In questa sezione daremo descrizione essenziale di cosa sono i \textit{socket}
+e di quali sono i concetti fondamentali da tenere presente quando si ha a che
+fare con essi; ne illustreremo poi le caratteristiche e le differenti
+tipologie presenti ed infine tratteremo le modalità con cui possono essere
+creati.
\index{socket!definizione|(}
-\subsection{I \textit{socket}}
+\subsection{Cosa sono \textit{socket}}
\label{sec:sock_socket_def}
I \textit{socket} (una traduzione letterale potrebbe essere \textsl{presa}, ma
solo con l'insieme dei protocolli TCP/IP, anche se questa sarà comunque quella
di cui tratteremo in maniera più estesa.
-
-\subsection{Concetti base}
-\label{sec:sock_gen}
-
Per capire il funzionamento dei socket occorre avere presente il funzionamento
-dei protocolli di rete che su utilizzeranno (vedi cap.~\ref{cha:network}), ma
-l'interfaccia è del tutto generale e benché le problematiche, e quindi le
-modalità di risolvere i problemi, siano diverse a seconda del tipo di
-protocollo di comunicazione usato, le funzioni da usare nella gestione dei
-socket restano le stesse.
+dei protocolli di rete che su utilizzeranno (ed in particolare quelli del
+TCP/IP già illustrati in sez.~\ref{sec:net_tpcip}), ma l'interfaccia è del
+tutto generale e benché le problematiche, e quindi le modalità di risolvere i
+problemi, siano diverse a seconda del tipo di protocollo di comunicazione
+usato, le funzioni da usare nella gestione dei socket restano le stesse.
Per questo motivo una semplice descrizione dell'interfaccia è assolutamente
inutile, in quanto il comportamento di quest'ultima e le problematiche da
affrontare cambiano radicalmente a seconda del tipo di comunicazione usato.
-La scelta di questo tipo (sovente anche detto \textsl{stile}) va infatti ad
-incidere sulla semantica che verrà utilizzata a livello utente per gestire la
-comunicazione cioè su come inviare e ricevere i dati e sul comportamento
-effettivo delle funzioni utilizzate.
+La scelta di questo tipo di comunicazione (sovente anche detto \textsl{stile})
+va infatti ad incidere sulla semantica che verrà utilizzata a livello utente
+per gestire la comunicazione cioè su come inviare e ricevere i dati e sul
+comportamento effettivo delle funzioni utilizzate.
La scelta di uno \textsl{stile} dipende sia dai meccanismi disponibili, sia
dal tipo di comunicazione che si vuole effettuare. Ad esempio alcuni tipi di
essere condotta con una connessione diretta con un solo corrispondente, come
per una telefonata; altri casi possono prevedere una comunicazione come per
lettera, in cui si scrive l'indirizzo su ogni pacchetto, altri ancora una
-comunicazione \itindex{broadcast} \textit{broadcast} come per la radio, in cui
-i pacchetti vengono emessi su appositi ``\textsl{canali}'' dove chiunque si
-collega possa riceverli.
+comunicazione uno a molti come il \textit{broadcast} ed il \textit{multicast},
+in cui i pacchetti possono venire emessi su appositi ``\textsl{canali}'' dove
+chiunque si collega possa riceverli.
+
+É chiaro che ciascuno di questi diversi aspetti è associato ad un tipo di
+comunicazione che comporta una modalità diversa di gestire la stessa, ad
+esempio se la comunicazione è inaffidabile occorrerà essere in grado di
+gestire la perdita o il rimescolamento dei dati, se è a pacchetti questi
+dovranno essere opportunamente trattati, se è uno a molti occorrerà tener
+conto della eventuale unidirezionalità della stessa, ecc.
-É chiaro che ciascuno di questi diversi aspetti associato ad un tipo di
-comunicazione comporta una modalità diversa di gestire la stessa, ad esempio
-se è inaffidabile occorrerà essere in grado di gestire la perdita o il
-rimescolamento dei dati, se è a pacchetti questi dovranno essere
-opportunamente trattati, ecc.
+\index{socket!definizione|)}
-\section{La creazione di un socket}
+\subsection{La creazione di un socket}
\label{sec:sock_creation}
Come accennato l'interfaccia dei socket è estremamente flessibile e permette
in questa sezione vedremo come è possibile creare un socket e come specificare
il tipo di comunicazione che esso deve utilizzare.
-\subsection{La funzione \func{socket}}
-\label{sec:sock_socket}
-
La creazione di un socket avviene attraverso l'uso della funzione di sistema
\funcd{socket}; essa restituisce un \textit{file descriptor} (del tutto
analogo a quelli che si ottengono per i file di dati e le \textit{pipe},
seguendo la convenzione usata nelle pagine di manuale.
I domini (e i relativi nomi simbolici), così come i nomi delle famiglie di
-indirizzi, sono definiti dall'\textit{header file} \headfile{socket.h}. Un
+indirizzi, sono definiti dall'\textit{header file} \headfiled{socket.h}. Un
elenco delle famiglie di protocolli disponibili in Linux è riportato in
tab.~\ref{tab:net_pf_names}. L'elenco indica tutti i protocolli definiti; fra
questi però saranno utilizzabili solo quelli per i quali si è compilato il
tre tipi, Linux supporta anche gli altri, come si può verificare nel file
\texttt{include/linux/net.h} dei sorgenti del kernel.}
-\begin{basedescript}{\desclabelwidth{2.9cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
\item[\const{SOCK\_STREAM}] Provvede un canale di trasmissione dati
bidirezionale, sequenziale e affidabile. Opera su una connessione con un
altro socket. I dati vengono ricevuti e trasmessi come un flusso continuo di
devono usarlo, è riservato all'uso di sistema.
\item[\const{SOCK\_RDM}] Provvede un canale di trasmissione di dati
affidabile, ma in cui non è garantito l'ordine di arrivo dei pacchetti.
-\item[\const{SOCK\_PACKET}] Obsoleto, non deve essere più usato.\footnote{e
- pertanto non ne parleremo ulteriormente.}
+\item[\const{SOCK\_PACKET}] Obsoleto, non deve essere più usato (e pertanto
+ non ne parleremo ulteriormente).
\end{basedescript}
A partire dal kernel 2.6.27 l'argomento \param{type} della funzione
non strettamente attinenti all'indicazione del tipo secondo i valori appena
illustrati. Essi infatti possono essere combinati con un OR aritmetico delle
ulteriori costanti:
-\begin{basedescript}{\desclabelwidth{2.9cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
\item[\const{SOCK\_CLOEXEC}] imposta il flag di \textit{close-on-exec} sul
file descriptor del socket, ottenendo lo stesso effetto del flag
\const{O\_CLOEXEC} di \func{open} (vedi tab.~\ref{tab:open_operation_flag}),
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/sockaddr.h}
\end{minipage}
\caption{La struttura generica degli indirizzi dei socket
\multicolumn{1}{|c|}{\textbf{Header}} \\
\hline
\hline
- \type{int8\_t} & intero a 8 bit con segno & \headfile{sys/types.h}\\
- \type{uint8\_t} & intero a 8 bit senza segno & \headfile{sys/types.h}\\
- \type{int16\_t} & intero a 16 bit con segno & \headfile{sys/types.h}\\
- \type{uint16\_t} & intero a 16 bit senza segno& \headfile{sys/types.h}\\
- \type{int32\_t} & intero a 32 bit con segno & \headfile{sys/types.h}\\
- \type{uint32\_t} & intero a 32 bit senza segno& \headfile{sys/types.h}\\
+ \typed{int8\_t} & intero a 8 bit con segno & \headfile{sys/types.h}\\
+ \typed{uint8\_t} & intero a 8 bit senza segno & \headfile{sys/types.h}\\
+ \typed{int16\_t} & intero a 16 bit con segno & \headfile{sys/types.h}\\
+ \typed{uint16\_t} & intero a 16 bit senza segno& \headfile{sys/types.h}\\
+ \typed{int32\_t} & intero a 32 bit con segno & \headfile{sys/types.h}\\
+ \typed{uint32\_t} & intero a 32 bit senza segno& \headfile{sys/types.h}\\
\hline
- \type{sa\_family\_t} & famiglia degli indirizzi&\headfile{sys/socket.h}\\
- \type{socklen\_t} & lunghezza (\type{uint32\_t}) dell'indirizzo di
+ \typed{sa\_family\_t} & famiglia degli indirizzi&\headfile{sys/socket.h}\\
+ \typed{socklen\_t} & lunghezza (\type{uint32\_t}) dell'indirizzo di
un socket& \headfile{sys/socket.h}\\
\hline
- \type{in\_addr\_t} & indirizzo IPv4 (\type{uint32\_t}) &
+ \typed{in\_addr\_t} & indirizzo IPv4 (\type{uint32\_t}) &
\headfile{netinet/in.h}\\
- \type{in\_port\_t} & porta TCP o UDP (\type{uint16\_t})&
+ \typed{in\_port\_t} & porta TCP o UDP (\type{uint16\_t})&
\headfile{netinet/in.h}\\
\hline
\end{tabular}
I socket di tipo \const{PF\_INET} vengono usati per la comunicazione
attraverso internet; la struttura per gli indirizzi per un socket internet (se
si usa IPv4) è definita come \struct{sockaddr\_in} nell'header file
-\headfile{netinet/in.h} ed ha la forma mostrata in
+\headfiled{netinet/in.h} ed ha la forma mostrata in
fig.~\ref{fig:sock_sa_ipv4_struct}, conforme allo standard POSIX.1g.
\begin{figure}[!htb]
\footnotesize\centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/sockaddr_in.h}
\end{minipage}
\caption{La struttura \structd{sockaddr\_in} degli indirizzi dei socket
Il membro \var{sin\_addr} contiene un indirizzo internet, e viene acceduto sia
come struttura (un resto di una implementazione precedente in cui questa era
-una \direct{union} usata per accedere alle diverse classi di indirizzi) che
+una \dirct{union} usata per accedere alle diverse classi di indirizzi) che
direttamente come intero. In \headfile{netinet/in.h} vengono definite anche
alcune costanti che identificano alcuni indirizzi speciali, riportati in
tab.~\ref{tab:TCP_ipv4_addr}, che rincontreremo più avanti.
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/sockaddr_in6.h}
\end{minipage}
\caption{La struttura \structd{sockaddr\_in6} degli indirizzi dei socket
Il campo \var{sin6\_addr} contiene l'indirizzo a 128 bit usato da IPv6,
espresso da un vettore di 16 byte. Infine il campo \var{sin6\_scope\_id} è un
campo introdotto in Linux con il kernel 2.4, per gestire alcune operazioni
-riguardanti il \itindex{multicast} \textit{multicasting}. Si noti infine che
+riguardanti il \textit{multicasting}. Si noti infine che
\struct{sockaddr\_in6} ha una dimensione maggiore della struttura
\struct{sockaddr} generica di fig.~\ref{fig:sock_sa_gen_struct}, quindi
occorre stare attenti a non avere fatto assunzioni riguardo alla possibilità
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/sockaddr_un.h}
\end{minipage}
\caption{La struttura \structd{sockaddr\_un} degli indirizzi dei socket
locali (detti anche \textit{unix domain}) definita in
- \headfile{sys/un.h}.}
+ \headfiled{sys/un.h}.}
\label{fig:sock_sa_local_struct}
\end{figure}
Gli indirizzi AppleTalk devono essere specificati tramite una struttura
\struct{sockaddr\_atalk}, la cui definizione è riportata in
fig.~\ref{fig:sock_sa_atalk_struct}; la struttura viene dichiarata includendo
-il file \headfile{netatalk/at.h}.
+il file \headfiled{netatalk/at.h}.
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/sockaddr_atalk.h}
\end{minipage}
\caption{La struttura \structd{sockaddr\_atalk} degli indirizzi dei socket
senso solo in questo caso. In particolare \var{sll\_pkttype} può assumere i
seguenti valori: \const{PACKET\_HOST} per un pacchetto indirizzato alla
macchina ricevente, \const{PACKET\_BROADCAST} per un pacchetto di
-\itindex{broadcast} \textit{broadcast}, \const{PACKET\_MULTICAST} per un
-pacchetto inviato ad un indirizzo fisico di \itindex{multicast}
-\textit{multicast}, \const{PACKET\_OTHERHOST} per un pacchetto inviato ad
-un'altra stazione (e ricevuto su un'interfaccia in \index{modo~promiscuo} modo
-promiscuo), \const{PACKET\_OUTGOING} per un pacchetto originato dalla propria
-macchina che torna indietro sul socket.
+\textit{broadcast}, \const{PACKET\_MULTICAST} per un pacchetto inviato ad un
+indirizzo fisico di \textit{multicast}, \const{PACKET\_OTHERHOST} per un
+pacchetto inviato ad un'altra stazione (e ricevuto su un'interfaccia in
+\index{modo~promiscuo} modo promiscuo), \const{PACKET\_OUTGOING} per un
+pacchetto originato dalla propria macchina che torna indietro sul socket.
Si tenga presente infine che in fase di ricezione, anche se si richiede il
\textit{dotted decimal} per IPv4 e quello descritto in
sez.~\ref{sec:IP_ipv6_notation} per IPv6.
-\index{socket!definizione|)}
-