Allora io fare i così: (te lo scrivo in pseudocodice dato che non so se ti serve per win o unix)

strurrurerei il server in questo modo:

codice:
socket list_sock;
socket client_sock[MAX_CONN];
int c=0;
int main()
{
    /*Inizializzo le strutture del socket, setto porta e 
    tipi di connessioni accettate*/
    list_sock.bind(); //binding del socket
    crea_thread(list, argomenti);
    aspetta_thread(list);
    exit 0;
}

void *list(void *dummy)
{
     while(1)
     {
         client_sock[c] = list_sock.accetta_nuova();
         c++;
         crea_thread(dispatch_message,c)
     }
}

void *dispatch_message(void *dummy)
{
     int s = dummy;
     while(client_sock[s].read(buffer)) //rimane in attesa di dati dal client, se la connessione viene chiusa la funzione ritorna 0 ed esce dal ciclo
     {
         /*rispedisce il messaggio a tutti i client
         */
     }
     esci_thread(0);
}
e fin qui tutto dovrebbe essere abbastanza normale.

veniamo al client
codice:
socket sock;
int main()
{ 
    /*Inizializzo la struttura socket e stabilisco la connessione
    */
    sock.connect();
    crea_thread(read_mess,NULL)
    crea_thread(send_mess,NULL)
    aspetta_thread(list);
    aspetta_thread(list);
    exit 0;
}

void *read_mess()
{
     while(sock.read(buffer))//leggo fino alla terminazione della connessione
     {
          print(buffer); //stampo a video
     }
}

void *send_mess()
{
       while(1)
       {
            scan(buffer); //leggo da tastiera
            socket.send(buffer)//invio il messaggio al server;
       }
       exit_thread(0);
}
In pratica il client crea 2 thread separati: 1 rimane in attessa che l'utente scriva qualcosa o che lanci un comando (magari uno /exit per terminare o /list per avere la lista dei client connessi), mentre l'altro thread rimane in ascolto e si occupa di ricevere e stampare a video i messaggi provenienti dal server (tutte le comunicazioni tra client passano prima dal server)