Non mi sono spiegato bene o non hai ben chiaro il problema. Quando dicevo "solitamente si scrive nell'header del pacchetto la lunghezza del messaggio" non mi riferivo al fatto che "quando il client fa la write specifico chiaramente la lunghezza del messaggio" come da te scritto.
Se il client fa una write da 100k, non è che la puoi leggere con una singola read da 100k, il buffer di lettura del sistema operativo è di default molto minore.
Devi fare N volte read. Quante volte allora? Finche arrivi a leggere tutto il pacchetto, di solito si capisce che il pacchetto è finito perché negli header (del TUO protocollo) del pacchetto si invia anche la lunghezza.