1 main che esegue la accept e inserisce i nuovi client nel set della poll;
1 thread listener che controlla il set della poll e inserisce le nuove richieste in una coda ed effettua una signal per svegliare un worker
8 thread workers che eseguono varie operazioni richieste dai client come l'invio di un messaggio o di un file a un client o a tutti i clients, la creazione di un gruppo ecc.
I client possono essere connessi (in questo caso devo inviare il messaggio tramite la write e la scrittura su socket) o non connessi e in questo caso devo salvare il messaggio, in una tabella hash, da inviare sotto esplicita richiesta del client.
Ignoro il segnale EPIPE nel seguente modo
Codice: Seleziona tutto
struct sigaction s_pipe;
memset(&s_pipe, 0, sizeof(s_pipe));
s_pipe.sa_handler=SIG_IGN;
if((sigaction(SIGPIPE, &s_pipe, NULL))!=0){
perror("sigaction");
return -1;
}Ho una struttura messaggio che è composta da operzione, nome client sender, nome client receiver(se presente), buffer in cui scrivere il messaggio.
L'errore broken pipe della write ce l'ho all'invio del invio del messaggio al client. In particolare nell'invio dell'operazione che eseguo nel seguente modo:
Codice: Seleziona tutto
if((err=write((int)fd, &hdr->op, sizeof(op_t)))==-1){
fprintf(stderr,"Errore nell'invio dell'operazione; Funzione sendHeader; FD=%ld\n",fd);
perror("write");
return -1;
}