Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C]Problema simulazione di un login (client/server)

    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

  2. #2
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.