Ciao a tutti, ho un problema con la lettura da un socket. Ho 3 processi server che devono comunicare con un numero variabile di processi client, tuttavia alcuni messaggi non vengono scambiati come dovrebbero e la chiamata a read() che effettua il server per leggere dal socket il messaggio depositato dal client mi restituisce 0. So che questo valore significa che il socket è stato chiuso da una delle due parti, ma non capisco chi lo chiude! Il cliente non lo chiude esplicitamente (ho rimosso questa porzione di codice per verificare che non vi fossero anomalie, ma il problema permane). Il codice è abbastanza semplice: il server accetta una connessione e avvia un thread, che prende come parametro il valore ritornato dalla accept. Il thread è incaricato di leggere il messaggio da questo socket descriptor.
server:
codice:
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
while(1){
if( (acp = accept(fd_sock, NULL, NULL)) != -1 ){
thread = pthread_create(&t_id[i], &attr, worker, (void*)&acp);
if(thread == -1)
perror("Crezione thread");
i++;
}
}
il thread riceve il messaggio, chiamando 3 volte la receive, leggendo rispettivamente: un char, un int e una stringa.
codice:
int sock = *(int*)acp;
memset(msg, 0, sizeof(message_t));
while( (letti+= read(sock, &msg->type, sizeof(char) < sizeof(char)) )
if( letti <= 0){
return -1;
perror(Leggo char);
}
while( (letti_int+= read(sock, &msg->length, sizeof(unsigned int) < sizeof(unsigned int)) )
if( letti < sizeof(unsigned int) ) {
perror(Leggo int);
return -1;
}
while( (letti_buf+= read(sock, msg->buffer, msg->length)) < msg->lenght)
if( letti_buf <= msg->length){
perror(Letto buffer);
return -1;
}
Il cliente invece si limita a fare la write sul socket. Questa è corretta perchè invia il numero effettivo di byte.
A volte la prima read, quella che legge il char ritorna 0. Tuttavia il socket non è stato chiuso da nessuno! Come dovrei procedere per correggere l'errore?
Per chiarezza, la struttura msg contiene un char, un unsigned int e un char*.