Non riesco a postarti proprio tutto il codice perchè è molto articolato....
Questo è lo "scheletro":

codice:
/* Funzione del thread worker */
void * thr_worker(void * argv)
{
	char * buffer, *buf;
	buffer = calloc(256, sizeof(char));
        buff = calloc(256, sizeof(char));
		
	while(go)
    	{
		if(mess->type == MSG_LOGIN)
       		{
			printf("Login\n");
			/* codice per il login*/
                        buff = msgserver_pack(mess_server->type, mess_server->msg, NULL, NULL); 
                        write(newsockfd, buff, 256*sizeof(buff));
		}
		else if(mess->type == MSG_LOGOUT)
       		{
                        printf("Logout\n");
			/* codice per il logout*/
                        buff = msgserver_pack(mess_server->type, mess_server->msg, NULL, NULL); 
                        write(newsockfd, buff, 256*sizeof(buff));
		}
            	else if(mess->type == MSG_REGLOG)
       		{
                        printf("Registrazione e login\n");
			/* codice per il reg-log*/
                        buff = msgserver_pack(mess_server->type, mess_server->msg, NULL, NULL); 
			write(newsockfd, buff, 256*sizeof(buff));
		}
		else if(mess->type == MSG_LIST)
       		{
			printf("List\n");
                        buff = msgserver_pack(mess_server->type, mess_server->msg, NULL, NULL); 
			write(newsockfd, buff, 256*sizeof(buff)); 
		}
               	else 		//il server riceve un messaggio MSG_SINGLE o MSG_BRDCAST
		{
			printf("messaggio\n");
			if(mess->type == MSG_SINGLE) 
				richiesta = mess->receiver;	
                        else 						
				richiesta = "broadcast";		
			inizializza(&buffer_circolare);		//inizializzo il buffer circolare
			inserisci(&buffer_circolare, richiesta); //inserisco la richiesta su un buffer circolare
			if((pthread_create(&dispatcher, NULL, thr_dispatcher, NULL))<0)        
                        //creazione del thread dispatcher
			{
				fprintf(stderr,"Errore!! Thread dispatcher non creato!!");
				exit(1);
			}
		}
		recv(newsockfd, buffer, 256*sizeof(buffer),0);
		mess = (msg_t *) malloc(sizeof(msg_t));
		mess = msg_unpack(buffer);
	}
	pthread_exit(NULL);
}
I messaggi sono costituiti da una struct e, per inviarli tramite socket internet, ho creato delle funzioni msg_pack e msg_unpack per impacchettare e per spacchettare il messaggio in un buffer. Premetto che il resto del codice funziona perchè l'ho provato a parte.