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)