PDA

Visualizza la versione completa : [C]Problema simulazione di un login (client/server)


Javino89
18-07-2012, 15:24
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:


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:


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 :)

Javino89
18-07-2012, 15:38
Ho fatto un po di debug.. il server invia correttamente al client la risposta "NO", solo che quest'ultimo legge misteriosamente "OK" e chiude, facendo chiudere anche il server.. ma non capisco il motivo.

Loading