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