+
+La funzione \texttt{bind} assegna un indirizzo locale ad un socket, è usata
+cioè 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à in ascolto.
+
+Il prototipo della funzione è il seguente:
+
+\begin{prototype}{sys/socket.h}
+{int bind(int sockfd, const struct sockaddr *serv\_addr, socklen\_t addrlen)}
+
+ Il primo argomento è 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à trattato in \secref{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{errlist}
+ \item \texttt{EBADF} Il file descriptor non è valido.
+ \item \texttt{EINVAL} Il socket ha già un indirizzo assegnato.
+ \item \texttt{ENOTSOCK} Il file descriptor non è associato ad un socket.
+ \item \texttt{EACCESS} Si è cercato di usare un indirizzo riservato senza
+ essere root.
+ \end{errlist}
+\end{prototype}
+
+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 è il kernel a
+scegliere una porta effimera quando vengono eseguite la funzioni
+\texttt{connect} o \texttt{listen}, ma se questo è normale per il client non
+lo è per il server\footnote{un'eccezione a tutto ciò 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 è 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ò assegnare un IP specifico ad un socket, purché questo
+appartenga ad una interfaccia della macchina. Per un client TCP questo
+diventerà l'indirizzo sorgente usato per i tutti i pacchetti inviati sul
+socket, mentre per un server TCP questo restringerà 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à 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
+è pari a zero, nell'esempio \figref{fig:net_serv_sample} si è 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 è usato \texttt{htonl} per assegnare il valore
+\texttt{INADDR\_ANY}; benché essendo questo pari a zero il riordinamento sia
+inutile; ma dato che tutte le constanti \texttt{INADDR\_} sono definite
+secondo l'ordinamento della macchina è buona norma usare sempre la funzione
+\texttt{htonl}.
+
+L'esempio precedete funziona con IPv4 dato che l'indirizzo è rappresentabile
+anche con un intero a 32 bit; non si può usare lo stesso metodo con IPv6,
+in cui l'indirizzo è specificato come struttura, perché 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} è 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} è usata da un client TCP per stabilire la
+connessione con un server TCP, il prototipo della funzione è il seguente:
+
+\begin{prototype}{sys/socket.h}
+{int connect(int sockfd, const struct sockaddr *serv\_addr, socklen\_t addrlen)}
+
+ Il primo argomento è 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à descritta in \secref{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{errlist}
+ \item \texttt{EBADF} Il file descriptor non è valido.
+ \item \texttt{EFAULT} L'indirizzo della struttura di indirizzi è al di fuori
+ dello spazio di indirizzi dell'utente.
+ \item \texttt{ENOTSOCK} Il file descriptor non è associato ad un socket.
+ \item \texttt{EISCONN} Il socket è già connesso.
+ \item \texttt{ECONNREFUSED} Non c'è nessuno in ascolto sull'indirizzo remoto.
+ \item \texttt{ETIMEDOUT} Si è avuto timeout durante il tentativo di
+ connessione.
+ \item \texttt{ENETUNREACH} La rete non è raggiungibile.
+ \item \texttt{EADDRINUSE} L'indirizzo locale è in uso.
+ \item \texttt{EINPROGRESS} Il socket è non bloccante e la connessione non
+ può essere conclusa immediatamente.
+ \item \texttt{EALREADY} Il socket è non bloccante e un tentativo precedente
+ di connessione non si è ancora concluso.
+ \item \texttt{EAGAIN} Non ci sono più porte locali libere.
+ \item \texttt{EAFNOSUPPORT} L'indirizzo non ha una famiglia di indirizzi
+ corretta nel relativo campo.
+ \item \texttt{EACCESS, EPERM} Si è tentato di eseguire una connessione ad un
+ indirizzo broacast senza che il socket fosse stato abilitato per il
+ broadcast.
+ \end{errlist}
+\end{prototype}
+
+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 \secref{sec:net_cli_sample} usando le funzioni illustrate in
+\secref{sec:sock_addr_func}.
+
+Nel caso di socket TCP la funzione \texttt{connect} avvia il three way
+handshake, e ritorna solo quando la connessione è stabilita o si è verificato
+un errore. Le possibili cause di errore sono molteplici (ed i relativi codici
+riportati sopra), quelle che però 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 è
+ \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ò 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 è 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'è
+ nessun programma in ascolto per la connessione sulla porta specificata (il
+ che vuol dire probablmente che o si è sbagliato il numero della porta o che
+ non è stato avviato il server), questo è 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 è 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ò
+ 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
+\figref{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 è più utilizzabile e deve essere chiuso.
+
+Si noti infine che con la funzione \texttt{connect} si è specificato solo
+indirizzo e porta del server, quindi solo una metà della socket pair; essendo
+questa funzione usata nei client l'altra metà contentente indirizzo e porta
+locale viene lasciata all'assegnazione automatica del kernel, e non è
+necessario effettuare una \texttt{bind}.
+
+