Sistemati i conflitti e scritta parte di accept.
authorSimone Piccardi <piccardi@gnulinux.it>
Thu, 17 May 2001 18:28:36 +0000 (18:28 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Thu, 17 May 2001 18:28:36 +0000 (18:28 +0000)
elemtcp.tex

index 7816ec5dd84b7b4282fb906114fb51fc884497b2..9eab58a2adf71cb073b6562dd5c17e3740f31069 100644 (file)
@@ -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)}
 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
   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}
 
 \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)}  
 
 
 \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
   \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
   \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{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
   \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}
 
   \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