Così, non mi pare ci siano errori...ma visto che il codice non è completo non posso aiutarti più di tanto
Quello che posso consigliarti è di mettere delle printf() (soprattutto prima/dopo le recv/write) per vedere il flusso di esecuzione.

PS:

codice:
void * thr_reader(void * argv)
{

	buffer = (msg_t *) malloc(sizeof(msg_t));
	buff_rd = calloc (256, sizeof(char));
			
	while(go)
	{
		....
		buffer = (msg_t *) malloc(sizeof(msg_t));
	} 
	return NULL;
}
Attenzione che allochi ad ogni ciclo della memoria, ma non la liberi. Se per caso lo fai nel codice omesso, ignora questo PS