Modifiche non registrate ieri sera
authorSimone Piccardi <piccardi@gnulinux.it>
Fri, 4 Jun 2004 00:31:33 +0000 (00:31 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Fri, 4 Jun 2004 00:31:33 +0000 (00:31 +0000)
listati/UDP_ClientEcho.c
listati/UDP_ClientEcho_first.c [new file with mode: 0644]
listati/UDP_echo.c
othersock.tex
sources/UDP_echo.c

index 3cbd3da..24bc6d6 100644 (file)
@@ -1,4 +1,4 @@
-void ClientEcho(FILE * filein, int socket, struct sockaddr_in * serv_addr
+void ClientEcho(FILE * filein, int socket) 
 {
     char sendbuff[MAXLINE+1], recvbuff[MAXLINE+1];
     int nread, nwrite; 
@@ -7,14 +7,13 @@ void ClientEcho(FILE * filein, int socket, struct sockaddr_in * serv_addr)
        if (fgets(sendbuff, MAXLINE, filein) == NULL) {
            return;                /* if no input just return */
        } else {                   /* else we have to write to socket */
-           nwrite = sendto(socket, sendbuff, strlen(sendbuff), 0,
-                           (struct sockaddr *) serv_addr, sizeof(*serv_addr));
+           nwrite = write(socket, sendbuff, strlen(sendbuff));
            if (nwrite < 0) {      /* on error stop */
                printf("Errore in scrittura: %s", strerror(errno));
                return;
            }
        }
-       nread = recvfrom(socket, recvbuff, strlen(sendbuff), 0, NULL, NULL); 
+       nread = read(socket, recvbuff, strlen(sendbuff)); 
        if (nread < 0) {  /* error condition, stop client */
            printf("Errore in lettura: %s\n", strerror(errno));
            return;
diff --git a/listati/UDP_ClientEcho_first.c b/listati/UDP_ClientEcho_first.c
new file mode 100644 (file)
index 0000000..3cbd3da
--- /dev/null
@@ -0,0 +1,28 @@
+void ClientEcho(FILE * filein, int socket, struct sockaddr_in * serv_addr) 
+{
+    char sendbuff[MAXLINE+1], recvbuff[MAXLINE+1];
+    int nread, nwrite; 
+    /* initialize file descriptor set */
+    while (1) {
+       if (fgets(sendbuff, MAXLINE, filein) == NULL) {
+           return;                /* if no input just return */
+       } else {                   /* else we have to write to socket */
+           nwrite = sendto(socket, sendbuff, strlen(sendbuff), 0,
+                           (struct sockaddr *) serv_addr, sizeof(*serv_addr));
+           if (nwrite < 0) {      /* on error stop */
+               printf("Errore in scrittura: %s", strerror(errno));
+               return;
+           }
+       }
+       nread = recvfrom(socket, recvbuff, strlen(sendbuff), 0, NULL, NULL); 
+       if (nread < 0) {  /* error condition, stop client */
+           printf("Errore in lettura: %s\n", strerror(errno));
+           return;
+       }
+       recvbuff[nread] = 0;   /* else read is ok, write on stdout */
+       if (fputs(recvbuff, stdout) == EOF) {
+           perror("Errore in scrittura su terminale");
+           return;
+       }
+    }
+}
index f28a408..501d08d 100644 (file)
@@ -1,6 +1,4 @@
-void ClientEcho(FILE * filein, int socket, struct sockaddr_in *serv_add);
-void SigTERM_hand(int sig);
-
+void ClientEcho(FILE * filein, int socket);
 /* Program begin */
 int main(int argc, char *argv[])
 {
@@ -8,7 +6,7 @@ int main(int argc, char *argv[])
  * Variables definition  
  */
     int sock, i;
-    struct sockaddr_in serv_add;
+    struct sockaddr_in dst_addr;
     ...
     /* create socket */
     if ( (sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
@@ -16,15 +14,15 @@ int main(int argc, char *argv[])
        return 1;
     }
     /* initialize address */
-    memset((void *) &serv_add, 0, sizeof(serv_add)); /* clear server address */
-    serv_add.sin_family = AF_INET;                   /* address type is INET */
-    serv_add.sin_port = htons(7);                    /* echo port is 7 */
+    memset((void *) &dst_addr, 0, sizeof(dst_addr)); /* clear address */
+    dst_addr.sin_family = AF_INET;                   /* address type is INET */
+    dst_addr.sin_port = htons(7);                    /* echo port is 7 */
     /* build address using inet_pton */
-    if ( (inet_pton(AF_INET, argv[optind], &serv_add.sin_addr)) <= 0) {
+    if ( (inet_pton(AF_INET, argv[optind], &dst_addr.sin_addr)) <= 0) {
        perror("Address creation error");
        return 1;
     }
-    connect(sock, &serv_add, sizeof(*serv_add));
+    connect(sock, (struct sockaddr *) &dst_addr, sizeof(dst_addr));
     /* do read/write operations */
     ClientEcho(stdin, sock);
     /* normal exit */
index d73aa57..9af54ba 100644 (file)
@@ -519,7 +519,7 @@ per
 \begin{figure}[!htb] 
   \footnotesize \centering
   \begin{minipage}[c]{15.6cm}
-    \includecodesample{listati/UDP_ClientEcho.c}
+    \includecodesample{listati/UDP_ClientEcho_first.c}
   \end{minipage}
   \normalsize
   \caption{Codice della funzione \func{ClientEcho} usata dal client per il
@@ -673,10 +673,11 @@ del socket, senza nessun controllo sulla sorgente; una volta che il socket
 viene connesso saranno riportati su di esso solo i pacchetti con un indirizzo
 sorgente corrispondente a quello a cui ci si è connessi. 
 
-Infine quando si è connesso un socket, venendo meno l'ambiguità segnalata alla
-fine di sez.~\ref{sec:UDP_problems}, tutti gli eventuali errori asincroni
-vengono riportati alle funzioni che operano su di esse, pertanto con le
-modifiche illustrate in fig.~\ref{fig:UDP_echo_conn_cli}.
+Infine quando si usa un socket connesso, venendo meno l'ambiguità segnalata
+alla fine di sez.~\ref{sec:UDP_problems}, tutti gli eventuali errori asincroni
+vengono riportati alle funzioni che operano su di esso; pertanto potremo
+riscrivere il nostro client per il servizio \textit{echo} con le modifiche
+illustrate in fig.~\ref{fig:UDP_echo_conn_cli}.
 
 \begin{figure}[!htb] 
   \footnotesize \centering
@@ -684,11 +685,30 @@ modifiche illustrate in fig.~\ref{fig:UDP_echo_conn_cli}.
     \includecodesample{listati/UDP_echo.c}
   \end{minipage}
   \normalsize
-  \caption{Nuova sezione della seconda versione del client del servizio
-    \textit{echo} che utilizza socket UDP connessi.}
+  \caption{Seconda versione del client del servizio \textit{echo} che utilizza
+    socket UDP connessi.}
   \label{fig:UDP_echo_conn_cli}
 \end{figure}
 
+Ed in questo caso rispetto alla precedente versione, il solo cambiamento è
+l'utilizzo (\texttt{\small 17}) della funzione \func{connect} prima della
+chiamata alla funzione di gestione del protocollo, che a sua volta è stata
+modificata eliminando l'indirizzo passato come parametro e sostituendo le
+chiamata a \func{sendto} e \func{recvfrom} con chiamate a \func{read} e
+\func{write} come illustrato dal nuovo codice riportato in
+fig.~\ref{fig:UDP_echo_conn_echo_client}.
+
+\begin{figure}[!htb] 
+  \footnotesize \centering
+  \begin{minipage}[c]{15.6cm}
+    \includecodesample{listati/UDP_ClientEcho.c}
+  \end{minipage}
+  \normalsize
+  \caption{Seconda versione della funzione \func{ClientEcho}.}
+  \label{fig:UDP_echo_conn_echo_client}
+\end{figure}
+
+
 
 
 
index a3bbd9b..cc9e3ae 100644 (file)
@@ -26,7 +26,7 @@
  *
  * Usage: echo -h give all info's
  *
- * $Id: UDP_echo.c,v 1.3 2004/06/02 16:31:50 piccardi Exp $
+ * $Id: UDP_echo.c,v 1.4 2004/06/04 00:31:33 piccardi Exp $
  *
  ****************************************************************/
 /* 
@@ -44,7 +44,7 @@
 
 #define MAXLINE 256
 void usage(void);
-void ClientEcho(FILE * filein, int socket, struct sockaddr_in *serv_add);
+void ClientEcho(FILE * filein, int socket);
 void SigTERM_hand(int sig);
 
 /* Program begin */
@@ -54,7 +54,7 @@ int main(int argc, char *argv[])
  * Variables definition  
  */
     int sock, i;
-    struct sockaddr_in serv_add;
+    struct sockaddr_in dst_addr;
     /*
      * Input section: decode parameters passed in the calling 
      * Use getopt function
@@ -90,15 +90,15 @@ int main(int argc, char *argv[])
        return 1;
     }
     /* initialize address */
-    memset((void *) &serv_add, 0, sizeof(serv_add)); /* clear server address */
-    serv_add.sin_family = AF_INET;                   /* address type is INET */
-    serv_add.sin_port = htons(7);                    /* echo port is 7 */
+    memset((void *) &dst_addr, 0, sizeof(dst_addr)); /* clear address */
+    dst_addr.sin_family = AF_INET;                   /* address type is INET */
+    dst_addr.sin_port = htons(7);                    /* echo port is 7 */
     /* build address using inet_pton */
-    if ( (inet_pton(AF_INET, argv[optind], &serv_add.sin_addr)) <= 0) {
+    if ( (inet_pton(AF_INET, argv[optind], &dst_addr.sin_addr)) <= 0) {
        perror("Address creation error");
        return 1;
     }
-    connect(sock, &serv_add, sizeof(*serv_add));
+    connect(sock, (struct sockaddr *) &dst_addr, sizeof(dst_addr));
     /* do read/write operations */
     ClientEcho(stdin, sock);
     /* normal exit */