Non so se aprire un altro posto o meno, in ogni caso ho seguito il tuo consiglio e sono riuscito a ricavare un errore. Prima di tutto sbagliavo la gestione dei messaggi in arrivo lato server: i client inviano un messaggio e si sospendono in attesa di risposta. Lato server, se il messaggio viene ricevuto male, davo subito un return -1, non riattivando mai il cliente. Ecco che dunque ho individuato lo stallo che mi si creava. Tuttavia ora mi rimane un errore che ricevo quando i messaggi in entrata sono un numero "notevole". Ho fatto la prova con 2 clienti e tutto va a buon fine, quando i clienti sono 3 invece, alcune receive mi restituiscono "Transport endpoint is not connected", dunque alcuni messaggi non vengono ricevuti dal server. Il codice del server è il seguente:
codice:
while(1){
int acp = acceptConnection(); //Funzione di libreria che fa semplicemente una accept
if( acp != -1){
pthread_create(&t_id[i], &attr, foo, (void*)&acp); //in attr c'è semplicemente lo stato di joinable, t_id è //un array di pthread_t
}
void *foo(void *par){
int sock = *(int*)par;
pthread_mutex_lock(mutex);
int recv = receiveMessage(sock, dest_messaggio); //Fa una receive di un messaggio impacchettato seguendo il //protocollo TLV.
if(recv <= 0) perror("Receive");
pthread_mutex_unlock(mutex);
}
La cosa strana ora è solo una: nella funzione receive message io ho impostato in diversi punti la stampa di eventuali errori, ricevendo però sempre e comunque l'esito success... La funzione è piuttosto semplice:
prende in input il socket descriptor e una struttura dove salvare il messaggio, dopodichè effettua nell'ordine:
codice:
int letti = read(socket, msg->type, sizeof(char)); //leggo il tipo
if(letti <= 0){
perror("Leggo tipo");
return -1;
}
letti = read(socket, msg->length, sizeof(int64_t)); //leggo lunghezza buffer
if(letti <= 0){
perror("Leggo int");
return -1;
}
letti = 0;
while( (letti += read(sc, msg->buffer, msg->length)) < msg->length){ //leggo buff
if(letti <= 0){
perror("Leggo buffer");
return -1;
}
}
I vari "perror" interni alla funzione non mi restituiscono errori, tuttavia la chiamata perror("Receive") nel thread talvolta si...Non capisco il perchè...