Salve Ho un problema con un codice già scritto, mi servirebbe una mano a capire come risolvere
In linea generale devo inserire nome utente e password che vengono inviati al server che ricerca
l'utente in un file. Se lo trova invia "OK" al client (più il permesso), altrimenti invia "NO". Si hanno a disposizione
3 tentativi. Funziona tutto se inserisco utenti validi, se provo ad inventarmi un utente non presente nel file ho
questo output:
Output client
Inserisci nickname: Luca
Inserisci la password:
Login effettuato con successo
Output server
Hai ancora 2 tentativi a disposizione
La read di [nickname] è fallita
Login del client fallito
CHIUSURA SERVER
Metto il codice...
Login lato client:
codice:
int login(int sock) {
int tentativi = 3;
printf("\n----LOGIN----\n");
Utente utente;
memset(utente.nickname,0,sizeof(utente.nickname));
memset(utente.password,0,sizeof(utente.password));
char conferma[CONFERMA];
memset(conferma,0,sizeof(conferma));
while(tentativi > 0) {
//Acquisizione dati
printf("Inserisci nickname: %s", utente.nickname);
while(scanf("%s", utente.nickname) == -1){
if(errno != EINTR){
printf("\nErrore scanf\n");
chiudiClient();
}
}
char *pass = getpass("\nInserisci la password: "); //La password viene nascosta
strcpy(utente.password,pass);
printf("\n");
//Invio dati
while(write(sock, utente.nickname, sizeof(utente.nickname)) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\nErrore nella write di [nickname]: CONNESSIONE FALLITA\n");
return -1;
}
else{
printf("La write di [nickname] è fallita\n");
return -1;
}
}
printf("Errore system call write [nickname]\n");
}
while(write(sock, utente.password, sizeof(utente.password)) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\nErrore nella write di [password]: CONNESSIONE FALLITA\n");
return -1;
}
else{
printf("La write di [password] è fallita\n");
return -1;
}
}
printf("Errore system call write [password]\n");
}
//Attendo la conferma e ricevo il permesso
while(read(sock, conferma, CONFERMA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\nErrore nella read di [conferma]: CONNESSIONE FALLITA\n");
return -1;
}
else{
printf("La read di [conferma] è fallita\n");
return -1;
}
}
printf("Errore system call read [conferma]\n");
}
if(strcmp(conferma, "OK") == 0){
printf("\nLogin effettuato con successo\n");
memset(conferma,0,sizeof(conferma));
//Ricevo il permesso
/*int permesso;
read(sock,&permesso,4);*/
return 1; //Solo ora per semplicità
}
if(strcmp(conferma, "NO") == 0){
memset(conferma,0,sizeof(conferma));
--tentativi;
if(tentativi == 2){
printf("\nNickname o Password errati: Hai ancora 2 tentativi");
}
if(tentativi == 1){
printf("\nNickname o Password errati: Hai ancora 1 tentativo");
}
}
}
if(tentativi == 0) {
printf("\nLogin fallito, tentativi esauriti\n");
return -1;
}
}
Login lato server:
codice:
int login(int sock) {
int tentativi = 3;
while(tentativi > 0) {
Utente utente;
memset(utente.nickname,0,sizeof(utente.nickname));
memset(utente.password,0,sizeof(utente.password));
//Acquisizione dati
while(read(sock, utente.nickname, NICKNAME) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\nErrore nella read di [nickname]: CONNESSIONE FALLITA\n");
return -1;
}
else{
printf("La read di [nickname] è fallita\n");
return -1;
}
}
printf("Errore system call read [nickname]\n");
}
while(read(sock, utente.password, PASSWORD) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\nErrore nella read di [password]: CONNESSIONE FALLITA\n");
return -1;
}
else{
printf("La read di [password] è fallita\n");
return -1;
}
}
printf("Errore system call read [password]\n");
}
//Cerco l'utente
Utente temp = cercaUtente(utente);
//Utente trovato
if((strcmp(utente.nickname, temp.nickname) == 0) && (strcmp(utente.password, temp.password) == 0)){
while(write(sock,"OK", CONFERMA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\nErrore nella write di [ok]: CONNESSIONE FALLITA\n");
return -1;
}
else{
printf("La write di [ok] è fallita\n");
return -1;
}
}
printf("Errore system call write [ok]\n");
}
memset(utente.nickname, 0, sizeof(utente.nickname));
memset(utente.password, 0, sizeof(utente.password));
//Invio il permesso al client
/*int permesso = temp.permesso;
write(sock,&permesso,4);*/
return 1;
}
//Utente non trovato
else {
while(write(sock,"NO", CONFERMA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\nErrore nella write di [no]: CONNESSIONE FALLITA\n");
return -1;
}
else{
printf("La write di [no] è fallita\n");
return -1;
}
}
printf("Errore system call write [no]\n");
}
--tentativi;
printf("\nHai ancora %d tentativi a disposizione\n", tentativi);
memset(utente.nickname, 0, sizeof(utente.nickname));
memset(utente.password, 0, sizeof(utente.password));
}
}
printf("\nLogin fallito dopo 3 tentativi\n");
return -1;
}
Grazie