From: Simone Piccardi Date: Thu, 17 May 2001 18:28:36 +0000 (+0000) Subject: Sistemati i conflitti e scritta parte di accept. X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=f15d1cc1ff7e1b4d15d434144862a5505bd33f0a;p=gapil.git Sistemati i conflitti e scritta parte di accept. --- diff --git a/elemtcp.tex b/elemtcp.tex index 7816ec5..9eab58a 100644 --- a/elemtcp.tex +++ b/elemtcp.tex @@ -824,7 +824,6 @@ chiamata ad \texttt{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 \texttt{sockfd} in modalità passiva e predispone una coda per le connessioni in arrivo di lunghezza pari a \texttt{backlog}. La funzione si può applicare solo a socket di tipo @@ -924,26 +923,37 @@ protocollo TCP. \subsection{La funzione \texttt{accept}} \label{sec:TCPel_func_accept} +La funzione \texttt{accept} è chiamata da un server TCP per gestire la +connessione una volta che sia stato completato il three way handshake, la +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)} - La funzione restituisce 0 in caso di successo e ... . I - codici di errore restituiti in \texttt{errno} sono i seguenti: + La funzione estrae la prima connessione completa relativa al socket + \texttt{sockfd} in attesa sulla coda delle connessioni complete che associa + nuovo socket con le stesse caratteristiche di \texttt{sockfd} (restituito + dalla funzione stessa). Il socket originale non viene toccato. Nella + struttura \texttt{addr} e nella variabile \texttt{addrlen} vengono + restituiti indirizzo e relativa lunghezza del client che si è connesso. + + La funzione restituisce un numero di socket descriptor positivo in caso di + successo e -1 in caso di errore, nel qual caso la variabile \texttt{errno} + viene settata ai seguenti valori: + \begin{errlist} \item \texttt{EBADF} L'argomento \texttt{sockfd} non è un file descriptor valido. \item \texttt{ENOTSOCK} L'argomento \texttt{sockfd} non è un socket. \item \texttt{EOPNOTSUPP} Il socket è di un tipo che non supporta questa - operazione. - + operazione. \item \texttt{EAGAIN} or \item \texttt{EWOULDBLOCK} Il socket è stato settato come non bloccante, e non ci sono connessioni in attesa di essere - accettate. - + accettate. \item \texttt{EFAULT} The addr parameter is not in a writable part of the user address space. - \item \texttt{EPERM} Firewall rules forbid connection. \item \texttt{ENOBUFS, ENOMEM} Not enough free memory. This often means @@ -952,11 +962,35 @@ protocollo TCP. \end{errlist} \end{prototype} -\section{Una semplice implementazione del servizio \texttt{echo} su TCP} -\label{sec:TCPel_echo_example} +La funzione può essere usata solo con socket che supportino la connessione +(cioè di tipo \texttt{SOCK\_STREAM}, \texttt{SOCK\_SEQPACKET} o +\texttt{SOCK\_RDM}). Per alcuni protocolli che richiedono una conferma +esplicita della connessione, (attualmenente in linux solo DECnet ha questo +comportamento), la funzione opera solo l'estrazione dalla coda delle +connessioni, la conferma della connessione viene fatta implicitamente dalla +prima chiamata ad una \texttt{read} o una \texttt{write} mentre il rifiuto +della connessione viene fatta con la funzione \texttt{close}. +I due parametri \texttt{cliaddr} e \texttt{addrlen} (si noti che quest'ultimo +è passato per indirizzo per avere indietro il valore) sono usati per ottenere +l'indirizzo del client da cui proviene la connessione. Prima della chiamata +\texttt{addrlen} deve essere inizializzato alle dimensioni della struttura il +cui indirizzo è passato come parametro in \texttt{cliaddr}, al rientro della +funzione \texttt{addrlen} conterrà il numero di bytes scritti dentro +\texttt{cliaddr}. +Se la funzione ha successo restituisce un nuovo socket descriptor, detto +\textit{connected socket}, su cui è agganciata la connessione che il client +TCP ha effettuato verso il socket \texttt{sockfd}. Quest'ultimo, che viene +chiamato invece \textit{listening socket}, deve essere stato creato in +precedenza e messo in ascolto con \texttt{listen}, e non viene toccato dalla +funzione. +Questa distinzione è essenziale per capire +\section{Una semplice implementazione del servizio \texttt{echo} su TCP} +\label{sec:TCPel_echo_example} + +Veniamo ora ad una applicazione