+
+\subsection{La funzione \texttt{bind}}
+\label{sec:TCPel_func_bind}
+
+
+La funzione \texttt{bind} assegna un indirizzo locale ad un socket, \81è usata
+cio\81è per specificare la prima parte dalla socket pair. Viene usata sul lato
+server per specificare la porta (e gli eventuali indirizzi locali) su cui poi
+ci si porr\81à in ascolto.
+
+Il prototipo della funzione, definito in \texttt{sys/socket.h}, \81è il seguente:
+
+\begin{itemize}
+\item \texttt{int bind(int sockfd, const struct sockaddr *serv_addr,
+ socklen_t addrlen) }
+
+ Il primo argomento \81è un file descriptor ottenuto da una precedente chiamata
+ a \texttt{socket}, mentre il secondo e terzo argomento sono rispettivamente
+ l'indirizzo (locale) del socket e la dimensione della struttura che lo
+ contiene, secondo quanto gi\81à trattato in \ref{sec:sock_sockaddr}.
+
+ La funzione restituisce zero in caso di successo e -1 per un errore, in caso
+ di errore. La variabile \texttt{errno} viene settata secondo i seguenti
+ codici di errore:
+
+ \begin{itemize}
+ \item \texttt{EBADF} Il file descriptor non \81è valido.
+ \item \texttt{EINVAL} Il socket ha gi\81à un indirizzo assegnato.
+ \item \texttt{ENOTSOCK} Il file descriptor non \81è associato ad un socket.
+ \item \texttt{EACCESS} Si \81è cercato di usare un indirizzo riservato senza
+ essere root.
+ \end{itemize}
+
+\end{itemize}
+
+Con il TCP la chiamata \texttt{bind} permette di specificare l'indirizzo, la
+porta, entrambi o nessuno dei due. In genere i server utilizzano una porta
+nota che assegnano all'avvio, se questo non viene fatto \81è il kernel a
+scegliere una porta effimera quando vengono eseguite la funzioni
+\texttt{connect} o \texttt{listen}, ma se questo \81è normale per il client non
+lo \81è per il server\footnote{un'eccezione a tutto ci\81ò i server che usano RPC.
+ In questo caso viene fatta assegnare dal kernel una porta effimera che poi
+ viene registrata presso il \textit{portmapper}; quest'ultimo \81è un altro
+ demone che deve essere contattato dai client per ottenere la porta effimera
+ su cui si trova il server} che in genere viene identificato dalla porta su
+cui risponde.
+
+Con \texttt{bind} si pu\81ò assegnare un IP specifico ad un socket, purch\81é questo
+appartenga ad una interfaccia della macchina. Per un client TCP questo
+diventer\81à l'indirizzo sorgente usato per i tutti i pacchetti inviati sul
+socket, mentre per un server TCP questo restringer\81à l'accesso al socket solo
+alle connessioni che arrivano verso tale indirizzo.
+
+Normalmente un client non specifica mai un indirizzo ad un suo socket, ed il
+kernel sceglie l'indirizzo di orgine quando viene effettuata la connessione
+sulla base dell'interfaccia usata per trasmettere i pacchetti, (che dipende
+dalle regole di instradamento usate per raggiungere il server).
+Se un server non specifica il suo indirizzo locale il kernel user\81à come
+indirizzo di origine l'indirizzo di destinazione specificato dal SYN del
+client.
+
+Per specificare un indirizzo generico con IPv4 si usa il valore
+\texttt{INADDR\_ANY}, il cui valore, come visto anche negli esempi precedenti
+\81è pari a zero, nell'esempio \ref{fig:net_serv_sample} si \81è usata
+un'assegnazione immediata del tipo:
+\begin{verbatim}
+ serv_add.sin_addr.s_addr = htonl(INADDR_ANY); /* connect from anywhere */
+\end{verbatim}
+
+Si noti che si \81è usato \texttt{htonl} per assegnare il valore
+\texttt{INADDR\_ANY}; bench\81é essendo questo pari a zero il riordinamento sia
+inutile; ma dato che tutte le constanti \texttt{INADDR\_} sono definite
+secondo l'ordinamento della macchina \81è buona norma usare sempre la funzione
+\texttt{htonl}.
+
+L'esempio precedete funziona con IPv4 dato che l'indirizzo \81è rappresentabile
+anche con un intero a 32 bit; non si pu\81ò usare lo stesso metodo con IPv6,
+in cui l'indirizzo \81è specificato come struttura, perch\81é il linguaggio C non
+consente l'uso di una struttura costante come operando a destra in una
+assegnazione. Per questo nell'header \texttt{netinet/in.h} \81è definita una
+variabile \texttt{in6addr\_any} (dichiarata come \texttt{extern}, ed
+inizializzata dal sistema al valore \texttt{IN6ADRR\_ANY\_INIT}) che permette
+di effettuare una assegnazione del tipo:
+\begin{verbatim}
+ serv_add.sin6_addr = in6addr_any; /* connect from anywhere */
+\end{verbatim}
+
+