\begin{figure}[htb]
\centering
- \includegraphics[width=10cm]{img/three_way_handshake.eps}
+ \includegraphics[width=10cm]{img/three_way_handshake}
\caption{Il \textit{three way handshake} del TCP}
\label{fig:TCPel_TWH}
\end{figure}
\begin{figure}[htb]
\centering
- \includegraphics[width=10cm]{img/tcp_close.eps}
+ \includegraphics[width=10cm]{img/tcp_close}
\caption{La chiusura di una connessione TCP}
\label{fig:TCPel_close}
\end{figure}
\begin{figure}[htb]
\centering
- \includegraphics[width=9cm]{img/tcp_connection.eps}
+ \includegraphics[width=9cm]{img/tcp_connection}
\caption{Schema dello scambio di pacchetti per un esempio di connessione}
\label{fig:TPCel_conn_example}
\end{figure}
\begin{figure}[!htb]
\centering
- \includegraphics[width=10cm]{img/tcpip_overview.eps}
+ \includegraphics[width=10cm]{img/port_alloc}
\caption{Allocazione dei numeri di porta}
\label{fig:TCPel_port_alloc}
\end{figure}
La funzione \func{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 *servaddr, socklen\_t addrlen)}
un server dopo le chiamate a \func{socket} e \func{bind} e prima della
chiamata ad \func{accept}. Il prototipo della funzione come definito dalla
man page è:
-
\begin{prototype}{sys/socket.h}{int listen(int sockfd, int backlog)}
La funzione pone il socket specificato da \var{sockfd} in modalità
passiva e predispone una coda per le connessioni in arrivo di lunghezza pari
funzione restituisce un nuovo socket descriptor su cui si potrà operare per
effettuare la comunicazione. Se non ci sono connessioni completate il processo
viene messo in attesa. Il prototipo della funzione è il seguente:
-
\begin{prototype}{sys/socket.h}
-{int listen(int sockfd, struct sockaddr *addr, socklen\_t *addrlen)}
+{int accept(int sockfd, struct sockaddr *addr, socklen\_t *addrlen)}
La funzione estrae la prima connessione relativa al socket \var{sockfd}
in attesa sulla coda delle connessioni complete, che associa ad nuovo socket
- con le stesse caratteristiche di \vara{sockfd} (restituito dalla funzione
+ con le stesse caratteristiche di \var{sockfd} (restituito dalla funzione
stessa). Il socket originale non viene toccato. Nella struttura
\var{addr} e nella variabile \var{addrlen} vengono restituiti
indirizzo e relativa lunghezza del client che si è connesso.
operazione.
\item \macro{EAGAIN} o \macro{EWOULDBLOCK} il socket è stato settato come
non bloccante, e non ci sono connessioni in attesa di essere accettate.
- \item \macro{EFAULT} l'argomento \avr{addr} .
+ \item \macro{EFAULT} l'argomento \var{addr} .
\item \macro{EPERM} Firewall rules forbid connection.
\item \macro{ENOBUFS, ENOMEM} Not enough free memory. This often means
può usare la funzione \func{shutdown} su cui torneremo in seguito.
+
\section{I server concorrenti su TCP}
\label{sec:TCPel_cunc_serv}
\func{accept}, restituisce l'indirizzo locale che il kernel ha assegnato a
quella connessione.
-
\begin{prototype}{sys/socket.h}
{int getpeername(int sockfd, struct sockaddr * name, socklen\_t * namelen)}
La funzione restituisce 0 in caso di successo e -1 in caso di errore. I
codici di errore restituiti in \var{errno} sono i seguenti:
\begin{errlist}
- \item \maccro{EBADF} l'argomento \var{sockfd} non è un file descriptor
+ \item \macro{EBADF} l'argomento \var{sockfd} non è un file descriptor
valido.
\item \macro{ENOTSOCK} l'argomento \var{sockfd} non è un socket.
\item \macro{ENOTCONN} il socket non è connesso.