No, il buffer è preparato con la memcpy, quello che ho scritto sotto è solo per dare un'idea di cosa occupa quale "posto" nel buffer.

Inoltre tutte le variabili vengono memorizzate mediante 3 chiamate alla read, ovvero:

- alloco un nuovo messaggio;
- leggo e memorizzo con read(socket, msg->type, sizeof(char));
- leggo e memorizzo l'intero con read(socket, msg->lenght, sizeof(int64_t));
- leggo e memorizzo il buffer con read(socket, msg->buffer, msg->lenght);

Ho chiesto della conversione perchè non mi spiego il motivo del comportamento della funzione in due chiamate praticamente consecutive, ovvero:

se scrivo printf("%d", msg->length), ottengo il valore esatto;
se scrivo if(msg->length == 0) risulta sempre vero, anche se ho appena visualizzato il valore corretto della lunghezza.
Inoltre, come ho già detto, la comunicazione avviene correttamente, e quel valore è stampato a video correttamente sia dal mittente che dal ricevente del messaggio.