\chapter{Un esempio completo di client/server TCP}
\label{cha:simple_TCP_sock}

In questo capitolo riprenderemo le funzioni trattate nel precedente, usandole
per scrivere una prima applicazione client/server che usi i socket TCP per una
comunicazione in entrambe le direzioni. 

L'applicazione sarà una implementazione elementare, ma completa, del servizio
\texttt{echo}. Si è scelto di usare questo servizio, seguendo lo Stevens, in
quanto esso costituisce il prototipo ideale di una generica applicazione di
rete; pertanto attraverso questo esempio potremo illustrare i fondamenti con i
quali si può costruire una qualunque applicazione di rete. 

Inoltre prenderemo in esame, oltre al comportamento in condizioni normali,
anche tutti i possibili scenari particolari (errori, sconnessione della rete,
crash del client o del server durante la connessione) che possono avere luogo
durante l'impiego di una applicazione di rete.


\section{Il servizio \texttt{echo}}
\label{sec:TCPsimp_echo}

Il servizio \texttt{echo} è uno dei servizi standard solitamente provvisti
direttamente dal superserver \texttt{inetd}, definito dall'RFC~862. Come dice
il nome il servizio deve semplicemente rimandare indietro i dati che gli
vengono inviati; l'RFC specifica che per il TCP una volta stabilita la
connessione ogni dato in ingresso deve essere rimandato in uscita, fintanto
che il chiamante non ha chiude la connessione; il servizio opera sulla porta
TCP numero 7.

Nel nostro caso l'esempio sarà strutturato scrivendo un client che legge una
linea dallo standard input e la scrive sul server, il server leggerà una linea
dalla connessione e la riscriverà all'indietro; sarà compito del client
leggere la risposta del server e stamparla sullo standard output.

