Ricezione del messaggio:

codice:
int ricezione(int sc, message_t* msg){
//Controllo parametri omesso 
/*Prima read, leggerò un solo char ottenendo il tipo del messaggio*/
	letti = read(sc, &msg->type, sizeof(char) );
	if( (letti == -1) || (letti == 0) || (letti < sizeof(char)) ){
		perror("Read type");
		return -1;
	}
	/*Seconda read, leggerò un int64_t ottenendo la lunghezza del messaggio*/
	int letti_length = 0;
	letti_length = read(sc, &msg->length, sizeof(int64_t) );
	if( (letti_length == -1) || (letti_length == 0) || (letti_length < sizeof(int64_t)) ){
		perror("Read length");
		return -1;
	}
	letti += letti_length;
	/*Terza read, leggerò msg->length caratteri ottenendo il buffer del messaggio*/
	int letti_buf = 0;
	while( (letti_buf += read(sc, &msg->buffer, msg->length) ) < msg->length){
		if( (letti_buf == -1) || (letti_buf == 0) ){
		perror("Read buffer");
		return -1;
		}
	}

return (letti+letti_buf);
}
stampo a video il messaggio appena ricevuto (qui è dove NON stampa il messaggio):
codice:
void  printMessage(message_t * msg) {
  if ( msg->length == 0 )  {
    printf("%c : <void>\n", msg->type);
    return;
  }
  printf("%c : %s\n", msg->type,msg->buffer);
}
Invio il medesimo messaggio appena ricevuto in questo modo (msgr è un messaggio di risposta nel quale copio il messaggio appena ricevuto):

codice:
    msgr.type = MSG_QUERY;
    strcpy(msgr.buffer,"server: ");

    if (msg.length > 0) strcat(msgr.buffer,msg.buffer);
    msgr.length = strlen(msgr.buffer) +1;
Il messaggio appena inviato verrà stampato CORRETTAMENTE dall'altro processo con questa funzione:

codice:
printMessage(&msg);