Si comincia a correggere il server
authorSimone Piccardi <piccardi@gnulinux.it>
Mon, 12 May 2003 22:52:29 +0000 (22:52 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Mon, 12 May 2003 22:52:29 +0000 (22:52 +0000)
elemtcp.tex
sources/TCP_echod.c

index ca37790..4ad16ac 100644 (file)
@@ -2052,8 +2052,16 @@ manifester
 
 La seconda soluzione è più invasiva e richiede di controllare tutte le volte
 l'errore restituito dalle varie system call, ripetendo la chiamata qualora
-questo corrisponda ad \errcode{EINTR}, questo comporta una riscrittura
-parziale del server secondo quanto mostrato in
+questo corrisponda ad \errcode{EINTR}. Questa soluzione ha però il pregio
+della portabilità, infatti lo standard POSIX dice che la funzionalità di
+riavvio automatico delle system call, fornita da \const{SA\_RESTART}, è
+opzionale, per cui non è detto che essa sia disponibile su qualunque sistema.
+Inoltre in certi casi,\footnote{Stevens in \cite{UNP1} accenna che la maggior
+  parte degli Unix derivati da BSD non fanno ripartire \func{select}, ed
+  alcuni non fanno ripartire neanche \func{accept} e \func{recvfrom}; nel caso
+  di Linux questa è disponibile.} anche quando questa è presente, non è detto
+possa essere usata con \func{accept}. La portabilità però viene al costo di
+una riscrittura parziale del server, secondo quanto mostrato in
 \figref{fig:TCP_echo_server_code}.
 
 \begin{figure}[!htbp]
index 831159a..3cc5ba3 100644 (file)
@@ -26,7 +26,7 @@
  *
  * Usage: echod -h give all info
  *
- * $Id: TCP_echod.c,v 1.2 2003/05/02 10:09:50 piccardi Exp $ 
+ * $Id: TCP_echod.c,v 1.3 2003/05/12 22:52:29 piccardi Exp $ 
  *
  ****************************************************************/
 /* 
@@ -136,7 +136,9 @@ int main(int argc, char *argv[])
     /* handle echo to client */
     while (1) {
        /* accept connection */
-       if ( (conn_fd = accept(list_fd, NULL, NULL)) < 0) {
+       while (((conn_fd = accept(list_fd, NULL, NULL)) < 0) 
+              && (errno == EINTR)); 
+       if ( conn_fd < 0) {
            PrintErr("accept error");
            exit(1);
        }