Per sapere invece quando ha finito con una trasmissione devi stabilire una sorta di "protocollo di scambio dati". Faccio un esempio: "il server trasmette dati di lunghezza variabile, ma so che l'ultimo carattere che riceverò è un \n" in questo caso fai il controllo sul \n per vedere quando ha finito.
Puoi usare o inventare altri modi per operare, basta che server e client siano in grado di intendersi.

PS: quando il client o il server chiude la connessione, l'implementazione del protocollo TCP/IP sull'altra macchina è in grado di accorgersi della chiusura, restituendo un codice d'errore dalle funzioni (rimando al manuale di unix per maggiori dettagli "man funzione")