Questa è la funzione login che viene richiamata e in cui c'è la read bloccante :
codice:
int login(int sock){
int tentativi = 3;
char risposta[RISPOSTA];
Utente utente;
printf("\n\nAttendere che il Server sia libero...\n\n");fflush(stdout);
/* Ricevo il via libera dal server */
/* QUESTA RECV PERMETTE L'ATTESA BLOCCANTE NEL CASO IN CUI PIU' CLIENT SIANO CONNESSI AL SERVER */
while(recv(sock, risposta, sizeof(risposta),0) <= 0){ //printf("\n\nVia libera del server ricevuto");fflush(stdout);
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush(stdout);
return -1;
}
else{
printf("Lettura fallita\n");fflush(stdout);
perror("Errore tipo");fflush(stdout);
return -1;
}
}
printf("Errore durante la system call, ripeto\n");fflush(stdout);
}
printf("\n--------------EFFETTUA IL LOGIN PER ACCEDERE--------------\n");fflush(stdout);
/* Resetto il valore della struct utente */
memset(utente.nickname, 0, sizeof(utente.nickname));
memset(utente.password, 0, sizeof(utente.password));
/* Resetto il valore della stringa risposta */
memset(risposta, 0, sizeof(risposta)); while(tentativi>0){
/* Digito il nickname e la password per il login */
printf("\nInserisci nickname: ");fflush(stdout);
while(scanf("%s", utente.nickname) == -1){
if(errno != EINTR){
printf("\nErrore scanf\n");
chiusuraClient();
}
}
printf("\nInserisci password: ");fflush(stdout);
while(scanf("%s", utente.password) == -1){
if(errno != EINTR){
printf("\nErrore scanf\n");
chiusuraClient();
}
}
printf("\n\nInvio dati in corso attendere...\n");
/* Invio il nickname al server */
while(send(sock, utente.nickname, strlen(utente.nickname),0) <= 0){ if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush(stdout);
return -1;
}
else{
printf("Lettura fallita\n");fflush(stdout);
perror("Errore tipo");fflush(stdout);
return -1;
}
}
printf("Errore durante la system call, ripeto\n");fflush(stdout); }
/* Invio la password al server */
while(send(sock, utente.password, strlen(utente.password),0) <= 0){ if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush(stdout);
return -1;
}
else{
printf("Lettura fallita\n");fflush(stdout);
perror("Errore tipo");fflush(stdout);
return -1;
}
}
printf("Errore durante la system call, ripeto\n");fflush(stdout); }
/* Ricevo la risposta dal server */
while(recv(sock, risposta, sizeof(risposta),0) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush(stdout);
return -1;
}
else{
printf("Lettura fallita\n");fflush(stdout);
perror("Errore tipo");fflush(stdout);
return -1;
}
}
printf("Errore durante la system call, ripeto\n");fflush(stdout); }
/* Login effettuato con successo */
if(strcmp(risposta, "OK") == 0){
printf("\nLogin effettuato con successo\n\n");
memset(risposta, 0, sizeof(risposta));
return 1;
}
/* Login errato, nuovo tentativo*/
if(strcmp(risposta, "NO") == 0){
printf("\nNickname o password ERRATI\n");
memset(risposta, 0, sizeof(risposta));
--tentativi;
if(tentativi == 2){
printf("Hai ancora %d tentativi di LOGIN\n", tentativi); }
if(tentativi == 1){
printf("Hai ancora %d tentativo di LOGIN\n", tentativi); }
premiInvio();
}
}
/* Login definitivamente fallito dopo 3 tentativi errati */
if(tentativi == 0){
printf("\nTentativo di LOGIN fallito\n");
chiusuraClient();
}
}
io in pratica vorrei mettere un timeout che chiuda la connessione con il Client se questo non effettua il login o richiede un'operazione entro un tot di tempo, in modo da liberare il server e passare al prossimo Client in coda...