From b9b609733592f0013892cc95e223386282ae6d57 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Fri, 4 Jun 2004 00:31:33 +0000 Subject: [PATCH] Modifiche non registrate ieri sera --- listati/UDP_ClientEcho.c | 7 +++---- listati/UDP_ClientEcho_first.c | 28 ++++++++++++++++++++++++++++ listati/UDP_echo.c | 16 +++++++--------- othersock.tex | 34 +++++++++++++++++++++++++++------- sources/UDP_echo.c | 16 ++++++++-------- 5 files changed, 73 insertions(+), 28 deletions(-) create mode 100644 listati/UDP_ClientEcho_first.c diff --git a/listati/UDP_ClientEcho.c b/listati/UDP_ClientEcho.c index 3cbd3da..24bc6d6 100644 --- a/listati/UDP_ClientEcho.c +++ b/listati/UDP_ClientEcho.c @@ -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 index 0000000..3cbd3da --- /dev/null +++ b/listati/UDP_ClientEcho_first.c @@ -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; + } + } +} diff --git a/listati/UDP_echo.c b/listati/UDP_echo.c index f28a408..501d08d 100644 --- a/listati/UDP_echo.c +++ b/listati/UDP_echo.c @@ -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 */ diff --git a/othersock.tex b/othersock.tex index d73aa57..9af54ba 100644 --- a/othersock.tex +++ b/othersock.tex @@ -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} + + diff --git a/sources/UDP_echo.c b/sources/UDP_echo.c index a3bbd9b..cc9e3ae 100644 --- a/sources/UDP_echo.c +++ b/sources/UDP_echo.c @@ -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 */ -- 2.30.2