+
+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}
+
+
+\subsection{La funzione \texttt{connect}}
+\label{sec:TCPel_func_connect}
+
+La funzione \texttt{connect} \81è usata da un client TCP per stabilire la
+connessione con un server TCP, il prototipo della funzione, definito in
+\texttt{sys/socket.h}, \81è il seguente:
+
+\begin{itemize}
+\item \texttt{int connect(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 e la dimensione della struttura che contiene l'indirizzo del
+ socket, gi\81à descritta 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{EFAULT} L'indirizzo della struttura di indirizzi \81è al di fuori
+ dello spazio di indirizzi dell'utente.
+ \item \texttt{ENOTSOCK} Il file descriptor non \81è associato ad un socket.
+ \item \texttt{EISCONN} Il socket \81è gi\81à connesso.
+ \item \texttt{ECONNREFUSED} Non c'\81è nessuno in ascolto sull'indirizzo remoto.
+ \item \texttt{ETIMEDOUT} Si \81è avuto timeout durante il tentativo di
+ connessione.
+ \item \texttt{ENETUNREACH} La rete non \81è raggiungibile.
+ \item \texttt{EADDRINUSE} L'indirizzo locale \81è in uso.
+ \item \texttt{EINPROGRESS} Il socket \81è non bloccante e la connessione non
+ pu\81ò essere conclusa immediatamente.
+ \item \texttt{EALREADY} Il socket \81è non bloccante e un tentativo precedente
+ di connessione non si \81è ancora concluso.
+ \item \texttt{EAGAIN} Non ci sono pi\81ù porte locali libere.
+ \item \texttt{EAFNOSUPPORT} L'indirizzo non ha una famiglia di indirizzi
+ corretta nel relativo campo.
+ \item \texttt{EACCESS, EPERM} Si \81è tentato di eseguire una connessione ad un
+ indirizzo broacast senza che il socket fosse stato abilitato per il
+ broadcast.
+ \end{itemize}
+\end{itemize}
+
+La struttura dell'indirizzo deve essere inizializzata con l'indirizzo IP e il
+numero di porta del server a cui ci si vuole connettere, come mostrato
+nell'esempio \ref{sec:net_cli_sample} usando le funzioni illustrate in
+\ref{sec:sock_addr_func}.
+
+Nel caso di socket TCP la funzione \texttt{connect} avvia il three way
+handshake, e ritorna solo quando la connessione \81è stabilita o si \81è verificato
+un errore. Le possibili cause di errore sono molteplici (ed i relativi codici
+riportati sopra), quelle che per\81ò dipendono dalla situazione della rete e non
+da errori o problemi nella chiamata della funzione sono le seguenti:
+
+\begin{enumerate}
+\item Il client non riceve risposta al SYN: l'errore restituito \81è
+ \texttt{ETIMEDOUT}. Stevens riporta che BSD invia un primo SYN alla chiamata
+ di \texttt{connect}, un'altro dopo 6 secondi, un terzo dopo 24 secondi, se
+ dopo 75 secondi non ha ricevuto risposta viene ritornato l'errore. Linux
+ invece ripete l'emissione del SYN ad intervalli di 30 secondi per un numero
+ di volte che pu\81ò essere stabilito dall'utente sia con una opportuna
+ \texttt{sysctl} che attraverso il filesystem \texttt{/proc} scrivendo il
+ valore voluto in \texttt{/proc/sys/net/ipv4/tcp_syn_retries}. Il valore di
+ default per la ripetizione dell'invio \81è di 5 volte, che comporta un timeout
+ dopo circa 180 secondi.
+%
+% Le informazioni su tutte le opzioni settabili via /proc stanno in
+% linux/Documentation/networking/ip-sysctl.txt
+%
+\item Il client riceve come risposta al SYN un RST significa che non c'\81è
+ nessun programma in ascolto per la connessione sulla porta specificata (il
+ che vuol dire probablmente che o si \81è sbagliato il numero della porta o che
+ non \81è stato avviato il server), questo \81è un errore fatale e la funzione
+ ritorna non appena il RST viene ricevuto riportando un errore
+ \texttt{ECONNREFUSED}.
+
+ Il flag RST sta per \textit{reset} ed \81è un segmento inviato direttamente
+ dal TCP quando qualcosa non va. Tre condizioni che generano un RST sono:
+ quando arriva un SYN per una porta che non ha nessun server in ascolto,
+ quando il TCP abortisce una connessione in corso, quandi TCP riceve un
+ segmento per una connessione che non esiste.
+
+\item Il SYN del client provoca l'emissione di un messaggio ICMP di
+ destinazione non raggiungibile. In questo caso dato che il messaggio pu\81ò
+ essere dovuto ad una condizione transitoria si ripete l'emmissione dei SYN
+ come nel caso precedente, fino al timeout, e solo allora si restituisce il
+ codice di errore dovuto al messaggio ICMP, che da luogo ad un
+ \texttt{ENETUNREACH}.
+
+\end{enumerate}
+
+Se si fa riferimento al diagramma degli stati del TCP riportato in
+\ref{fig:appB:tcp_state_diag} la funzione \texttt{connect} porta un socket
+dallo stato \texttt{CLOSED} (lo stato iniziale in cui si trova un socket
+appena creato) prima allo stato \texttt{SYN\_SENT} e poi, al ricevimento del
+ACK, nello stato \texttt{ESTABLISHED}. Se invece la connessione fallisce il
+socket non \81è pi\81ù utilizzabile e deve essere chiuso.
+
+Si noti infine che con la funzione \texttt{connect} si \81è specificato solo
+indirizzo e porta del server, quindi solo una met\81à della socket pair; nei
+socket TCP infatti l'altra met\81à contentente indirizzo e porta locale sono
+specificati automaticamente dal kernel, e non \81è necessario effettuare una
+\texttt{bind}.
+
+
+