%% socket.tex
%%
-%% Copyright (C) 2000-2012 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2014 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 "Un preambolo",
lo stesso nome.}
I domini (e i relativi nomi simbolici), così come i nomi delle famiglie di
-indirizzi, sono definiti dall'header \texttt{socket.h}. Un elenco delle
-famiglie di protocolli disponibili in Linux è riportato in
+indirizzi, sono definiti dall'\textit{header file} \headfile{socket.h}. Un
+elenco delle famiglie di protocolli disponibili in Linux è riportato in
tab.~\ref{tab:net_pf_names}.\footnote{l'elenco indica tutti i protocolli
definiti; fra questi però saranno utilizzabili solo quelli per i quali si è
compilato il supporto nel kernel (o si sono caricati gli opportuni moduli),
socket permette di scegliere lo stile di comunicazione indicando il tipo di
socket con l'argomento \param{type} di \func{socket}. Linux mette a
disposizione vari tipi di socket (che corrispondono a quelli che il manuale
-della \acr{glibc} \cite{glibc} chiama \textit{styles}) identificati dalle
+della \acr{glibc} \cite{GlibcMan} chiama \textit{styles}) identificati dalle
seguenti costanti:\footnote{le pagine di manuale POSIX riportano solo i primi
tre tipi, Linux supporta anche gli altri, come si può verificare nel file
\texttt{include/linux/net.h} dei sorgenti del kernel.}
pertanto non ne parleremo ulteriormente.}
\end{basedescript}
-Si tenga presente che non tutte le combinazioni fra una famiglia di protocolli
-e un tipo di socket sono valide, in quanto non è detto che in una famiglia
-esista un protocollo per ciascuno dei diversi stili di comunicazione appena
-elencati.
+A partire dal kernel 2.6.27 l'argomento \param{type} della funzione
+\func{socket} assume un significato ulteriore perché può essere utlizzato per
+impostare dei flag relativi alle caratteristiche generali del \textit{socket}
+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}}
+\item[\const{SOCK\_CLOEXEC}] imposta il flag di \textit{close-on-exec}
+ \itindex{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}), di cui costituisce l'analogo.
+
+\item[\const{SOCK\_NONBLOCK}] crea il socket in modalità non-bloccante, con
+ effetti identici ad una successiva chiamata a \func{fcntl} per impostare il
+ flag di \const{O\_NONBLOCK} sul file descriptor (si faccia di nuovo
+ riferimenti al significato di quest'ultimo come spiegato in
+ tab.~\ref{tab:open_operation_flag}).
+\end{basedescript}
+
+
+Si tenga presente inoltre che non tutte le combinazioni fra una famiglia di
+protocolli e un tipo di socket sono valide, in quanto non è detto che in una
+famiglia esista un protocollo per ciascuno dei diversi stili di comunicazione
+appena elencati.
\begin{table}[htb]
\footnotesize
I tipi di dati che compongono la struttura sono stabiliti dallo standard
POSIX.1g e li abbiamo riassunti in tab.~\ref{tab:sock_data_types} con i
rispettivi file di include in cui sono definiti; la struttura è invece
-definita nell'include file \file{sys/socket.h}.
+definita nell'include file \headfile{sys/socket.h}.
\begin{table}[!htb]
\centering
\multicolumn{1}{|c|}{\textbf{Header}} \\
\hline
\hline
- \type{int8\_t} & intero a 8 bit con segno & \file{sys/types.h}\\
- \type{uint8\_t} & intero a 8 bit senza segno & \file{sys/types.h}\\
- \type{int16\_t} & intero a 16 bit con segno & \file{sys/types.h}\\
- \type{uint16\_t} & intero a 16 bit senza segno& \file{sys/types.h}\\
- \type{int32\_t} & intero a 32 bit con segno & \file{sys/types.h}\\
- \type{uint32\_t} & intero a 32 bit senza segno& \file{sys/types.h}\\
+ \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}\\
\hline
- \type{sa\_family\_t} & famiglia degli indirizzi& \file{sys/socket.h}\\
+ \type{sa\_family\_t} & famiglia degli indirizzi&\headfile{sys/socket.h}\\
\type{socklen\_t} & lunghezza (\type{uint32\_t}) dell'indirizzo di
- un socket& \file{sys/socket.h}\\
+ un socket& \headfile{sys/socket.h}\\
\hline
\type{in\_addr\_t} & indirizzo IPv4 (\type{uint32\_t}) &
- \file{netinet/in.h}\\
+ \headfile{netinet/in.h}\\
\type{in\_port\_t} & porta TCP o UDP (\type{uint16\_t})&
- \file{netinet/in.h}\\
+ \headfile{netinet/in.h}\\
\hline
\end{tabular}
\caption{Tipi di dati usati nelle strutture degli indirizzi, secondo quanto
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
-\file{netinet/in.h} ed ha la forma mostrata in
+\headfile{netinet/in.h} ed ha la forma mostrata in
fig.~\ref{fig:sock_sa_ipv4_struct}, conforme allo standard POSIX.1g.
\begin{figure}[!htb]
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
-direttamente come intero. In \file{netinet/in.h} vengono definite anche alcune
-costanti che identificano alcuni indirizzi speciali, riportati in
+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.
Infine occorre sottolineare che sia gli indirizzi che i numeri di porta devono
Essendo IPv6 un'estensione di IPv4, i socket di tipo \const{PF\_INET6} sono
sostanzialmente identici ai precedenti; la parte in cui si trovano
praticamente tutte le differenze fra i due socket è quella della struttura
-degli indirizzi; la sua definizione, presa da \file{netinet/in.h}, è riportata
-in fig.~\ref{fig:sock_sa_ipv6_struct}.
+degli indirizzi; la sua definizione, presa da \headfile{netinet/in.h}, è
+riportata in fig.~\ref{fig:sock_sa_ipv6_struct}.
\begin{figure}[!htb]
\footnotesize \centering
\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 \file{sys/un.h}.}
+ locali (detti anche \textit{unix domain}) definita in
+ \headfile{sys/un.h}.}
\label{fig:sock_sa_local_struct}
\end{figure}
può essere un file (di tipo socket) nel filesystem o una stringa univoca
(mantenuta in uno spazio di nomi astratto). Nel primo caso l'indirizzo viene
specificato come una stringa (terminata da uno zero) corrispondente al
-\itindex{pathname} \textit{pathname} del file; nel secondo invece
-\var{sun\_path} inizia con uno zero e vengono usati come nome i restanti byte
-come stringa, senza terminazione.
+\textit{pathname} del file; nel secondo invece \var{sun\_path} inizia con uno
+zero e vengono usati come nome i restanti byte come stringa, senza
+terminazione.
\subsection{La struttura degli indirizzi AppleTalk}
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 \file{netatalk/at.h}.
+il file \headfile{netatalk/at.h}.
\begin{figure}[!htb]
\footnotesize \centering
\struct{in\_addr} (si veda fig.~\ref{fig:sock_sa_ipv4_struct}) situata
all'indirizzo dato dall'argomento \param{dest} (è espressa in questa forma in
modo da poterla usare direttamente con il puntatore usato per passare la
-struttura degli indirizzi). La funzione restituisce 0 in caso di successo e 1
-in caso di fallimento. Se usata con \param{dest} inizializzato a \val{NULL}
-effettua la validazione dell'indirizzo.
+struttura degli indirizzi). La funzione restituisce un valore diverso da zero
+se l'indirizzo è valido e la conversione ha successo e 0 in caso contrario.
+Se usata con \param{dest} inizializzato a \val{NULL} effettua la validazione
+dell'indirizzo.
L'ultima funzione, \func{inet\_ntoa}, converte il valore a 32 bit
dell'indirizzo (espresso in \textit{network order}) restituendo il puntatore