X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=simpltcp.tex;h=b4b9931413d9a08703352b2b39c54ed6c5b90b5b;hp=d723e308d32ff3c36296e66c91a7ec4ddd5aa4ba;hb=aee4a2e76ad7b0ed41eb06c4c70b8db5df9a4451;hpb=25de957ddf731370bec1eb74b13cf35aa7886d1b diff --git a/simpltcp.tex b/simpltcp.tex index d723e30..b4b9931 100644 --- a/simpltcp.tex +++ b/simpltcp.tex @@ -136,7 +136,7 @@ Il codice della funzione \code{ServEcho} all'interno del ciclo (linee \texttt{\small 6--8}). I dati inviati dal client vengono letti dal socket con una semplice \func{read} (che ritorna solo in presenza di dati in arrivo), la riscrittura viene invece gestita dalla -funzione \func{SockWrite} (descritta in \figref{fig:sock_SockWrite_code}) che +funzione \func{FullWrite} (descritta in \figref{fig:sock_FullWrite_code}) che si incarica di tenere conto automaticamente della possibilità che non tutti i dati di cui è richiesta la scrittura vengano trasmessi con una singola \func{write}. @@ -150,7 +150,7 @@ void ServEcho(int sockfd) { /* main loop, reading 0 char means client close connection */ while ( (nread = read(sockfd, buffer, MAXLINE)) != 0) { - nwrite = SockWrite(sockfd, buffer, nread); + nwrite = FullWrite(sockfd, buffer, nread); } return; } @@ -220,12 +220,11 @@ in \secref{sec:net_cli_sample}, il client si connette sulla porta 7 all'indirizzo specificato dalla linea di comando (a cui si è aggiunta una elementare gestione delle opzioni non riportata in figura). -Completata la connessione, al ritrno fiììdi \func{connect} è ritornata, la -funzione \code{ClientEcho}, riportata in -\figref{fig:TCPsimpl_client_echo_sub}, si preoccupa di gestire la -comunicazione, leggendo una riga alla volta dallo \file{stdin}, scrivendola -sul socket e ristampando su \file{stdout} quanto ricevuto in risposta dal -server. +Completata la connessione, al ritorno di \func{connect}, la funzione +\code{ClientEcho}, riportata in \figref{fig:TCPsimpl_client_echo_sub}, si +preoccupa di gestire la comunicazione, leggendo una riga alla volta dallo +\file{stdin}, scrivendola sul socket e ristampando su \file{stdout} quanto +ricevuto in risposta dal server. \begin{figure}[!htb] \footnotesize @@ -235,8 +234,8 @@ void ClientEcho(FILE * filein, int socket) char sendbuff[MAXLINE], recvbuff[MAXLINE]; int nread; while (fgets(sendbuff, MAXLINE, filein) != NULL) { - SockWrite(socket, sendbuff, strlen(sendbuff)); - nread = SockRead(socket, recvbuff, strlen(sendbuff)); + FullWrite(socket, sendbuff, strlen(sendbuff)); + nread = FullRead(socket, recvbuff, strlen(sendbuff)); recvbuff[nread] = 0; fputs(recvbuff, stdout); } @@ -254,11 +253,11 @@ La funzione utilizza due buffer per gestire i dati inviati e letti sul socket presi dallo \file{stdin} usando la funzione \func{fgets} che legge una linea di testo (terminata da un \texttt{CR} e fino al massimo di \const{MAXLINE} caratteri) e la salva sul buffer di invio, la funzione -\func{SockWrite} (\texttt{\small 3}) scrive detti dati sul socket (gestendo +\func{FullWrite} (\texttt{\small 3}) scrive detti dati sul socket (gestendo l'invio multiplo qualora una singola \func{write} non basti, come spiegato in \secref{sec:sock_io_behav}). -I dati che vengono riletti indietro con una \func{SockRead} sul buffer di +I dati che vengono riletti indietro con una \func{FullRead} sul buffer di ricezione e viene inserita la terminazione della stringa (\texttt{\small 7--8}) e per poter usare la funzione \func{fputs} per scriverli su \file{stdout}. @@ -408,7 +407,7 @@ Tutto questo riguarda la connessione, c' del procedimento di chiusura del processo figlio nel server (si veda quanto esaminato in \secref{sec:proc_termination}). In questo caso avremo l'invio del segnale \const{SIGCHLD} al padre, ma dato che non si è installato un -manipolatore e che l'azione predefinita per questo segnale è quella di essere +gestore e che l'azione predefinita per questo segnale è quella di essere ignorato, non avendo predisposto la ricezione dello stato di terminazione, otterremo che il processo figlio entrerà nello stato di zombie\index{zombie} (si riveda quanto illustrato in \secref{sec:sig_sigchld}), come risulterà @@ -425,9 +424,9 @@ del processo (si veda \secref{sec:proc_wait}), cosa che faremo utilizzando \const{SIGCHLD} secondo quanto illustrato in \secref{sec:sig_sigchld}. La prima modifica al nostro server è pertanto quella di inserire la gestione -della terminazione dei processi figli attraverso l'uso di un manipolatore. +della terminazione dei processi figli attraverso l'uso di un gestore. Per questo useremo la funzione \code{Signal}, illustrata in -\figref{fig:sig_Signal_code}, per installare il semplice manipolatore che +\figref{fig:sig_Signal_code}, per installare il semplice gestore che riceve i segnali dei processi figli terminati già visto in \figref{fig:sig_sigchld_handl}; aggiungendo il seguente codice: \begin{lstlisting}{}