Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Forum :: Programmazione.it :: C :: Problema simulazione login
Scritto da Loris Stefano a.k.a. javoso89 il 17-07-2012 ore 14:45
Intel Parallel Studio XE
Ebbene si sono sempre io in questa nuova ed entusiasmante puntata! >.<

Sempre per il mio solito progetto ho una parte di codice che funziona a metà, per la precisione il meccanismo di login dove dal client si inseriscono nickname e password che vengono inviati al server che ricerca l'utente. In caso di successo invia "OK" al client più il permesso per l'utente ed in caso di insuccesso invia "NO" al client. Si hanno tre tentativi e poi il ciclo ricomincia. Funziona tutto se l'utente è presente in lista, altrimenti mi fallisce la prima read del server (in attesa del nickname) e il client si comporta come se leggesse "OK" nonostante il server abbia inviato "NO". Allego il codice..

login lato client
  1. int login(int sock) {
  2.  
  3. 	int tentativi = 3;
  4.  
  5. 	printf("n----LOGIN----n");
  6.  
  7. 	Utente utente;
  8.  
  9. 	memset(utente.nickname,0,sizeof(utente.nickname));
  10.     memset(utente.password,0,sizeof(utente.password));
  11.  
  12.     char conferma[CONFERMA];
  13.  
  14.     memset(conferma,0,sizeof(conferma));
  15.  
  16.     while(tentativi > 0) {
  17.  
  18. 		//Acquisizione dati
  19. 		printf("Inserisci nickname: %s", utente.nickname);
  20. 		while(scanf("%s", utente.nickname) == -1){
  21.             if(errno != EINTR){
  22.             printf("nErrore scanfn");
  23.             chiudiClient();
  24.             }
  25.         }	
  26.  
  27.         char *pass = getpass("nInserisci la password: "); //La password viene nascosta
  28. 		strcpy(utente.password,pass);
  29. 		printf("n");
  30.  
  31. 		//Invio dati
  32. 		while(write(sock, utente.nickname, sizeof(utente.nickname))
Precedente: [MySQL error:MySQLDataset1]
Successiva: web service oggetti complessi
Intervento di Loris Stefano a.k.a. javoso89 del 17-07-2012 ore 14:48, Fossacesia (CH)
Plebeo
Plebeo
(38 interventi)
Iscritto il 21-04-2011
Uff.. rimetto il codice:

login lato client
  1. int login(int sock) {
  2.  
  3. 	int tentativi = 3;
  4.  
  5. 	printf("n----LOGIN----n");
  6.  
  7. 	Utente utente;
  8.  
  9. 	memset(utente.nickname,0,sizeof(utente.nickname));
  10.     memset(utente.password,0,sizeof(utente.password));
  11.  
  12.     char conferma[CONFERMA];
  13.  
  14.     memset(conferma,0,sizeof(conferma));
  15.  
  16.     while(tentativi > 0) {
  17.  
  18. 		//Acquisizione dati
  19. 		printf("Inserisci nickname: %s", utente.nickname);
  20. 		while(scanf("%s", utente.nickname) == -1){
  21.             if(errno != EINTR){
  22.             printf("nErrore scanfn");
  23.             chiudiClient();
  24.             }
  25.         }	
  26.  
  27.         char *pass = getpass("nInserisci la password: "); //La password viene nascosta
  28. 		strcpy(utente.password,pass);
  29. 		printf("n");
  30.  
  31. 		//Invio dati
  32. 		while(write(sock, utente.nickname, sizeof(utente.nickname)) < = 0){
  33. 			if(errno != EINTR){
  34.                 if(errno == ECONNRESET || errno == EPIPE){
  35.                      printf("nErrore nella write di [nickname]: CONNESSIONE FALLITAn");
  36.                      return -1;
  37.                  }
  38.                  else{
  39. 					  printf("La write di [nickname] è fallitan");
  40.                       return -1;
  41.                  }
  42.             }
  43.             printf("Errore system call write [nickname]n");
  44.         }
  45.  
  46.         while(write(sock, utente.password, sizeof(utente.password)) < = 0){
  47. 			if(errno != EINTR){
  48.                 if(errno == ECONNRESET || errno == EPIPE){
  49.                      printf("nErrore nella write di [password]: CONNESSIONE FALLITAn");
  50.                      return -1;
  51.                  }
  52.                  else{
  53. 					  printf("La write di [password] è fallitan");
  54.                       return -1;
  55.                  }
  56.             }
  57.             printf("Errore system call write [password]n");
  58.         }
  59.  
  60.         //Attendo la conferma e ricevo il permesso
  61.         while(read(sock, conferma, CONFERMA) < = 0){
  62. 			if(errno != EINTR){
  63.                 if(errno == ECONNRESET || errno == EPIPE){
  64.                      printf("nErrore nella read di [conferma]: CONNESSIONE FALLITAn");
  65.                      return -1;
  66.                  }
  67.                  else{
  68. 					  printf("La read di [conferma] è fallitan");
  69.                       return -1;
  70.                  }
  71.             }
  72.             printf("Errore system call read [conferma]n");
  73.         }
  74.  
  75.         if(strcmp(conferma, "OK") == 0){
  76.             printf("nLogin effettuato con successon");
  77.             memset(conferma,0,sizeof(conferma));
  78.  
  79.             //Ricevo il permesso
  80.  
  81.             int permesso;
  82.  
  83.             read(sock,&permesso,4);
  84.  
  85.             return permesso;
  86.         }
  87.  
  88.         if(strcmp(conferma, "NO") == 0){
  89. 			memset(conferma,0,sizeof(conferma));
  90. 			--tentativi;
  91. 			if(tentativi == 2){
  92. 				printf("nNickname o Password errati: Hai ancora 2 tentativi");
  93. 			}
  94. 			if(tentativi == 1){
  95. 				printf("nNickname o Password errati: Hai ancora 1 tentativo");
  96. 			}
  97. 		}
  98. 	}
  99.  
  100. 	if(tentativi == 0) {
  101. 		printf("nLogin fallito, tentativi esauritin");
  102. 		return -1;
  103. 	}
  104. }

login lato server
  1. int login(int sock) {
  2.  
  3. 	int tentativi = 3;
  4.  
  5. 	while(tentativi > 0) {
  6.  
  7. 		Utente utente;
  8.  
  9. 		memset(utente.nickname,0,sizeof(utente.nickname));
  10. 		memset(utente.password,0,sizeof(utente.password));
  11.  
  12. 		//Acquisizione dati
  13. 		while(read(sock, utente.nickname, NICKNAME) < = 0){
  14. 			if(errno != EINTR){
  15.                 if(errno == ECONNRESET || errno == EPIPE){
  16.                      printf("nErrore nella read di [nickname]: CONNESSIONE FALLITAn");
  17.                      return -1;
  18.                  }
  19.                  else{
  20. 					  printf("La read di [nickname] è fallitan");
  21.                       return -1;
  22.                  }
  23.             }
  24.             printf("Errore system call read [nickname]n");
  25.         }
  26.  
  27.         while(read(sock, utente.password, PASSWORD) < = 0){
  28. 			if(errno != EINTR){
  29.                 if(errno == ECONNRESET || errno == EPIPE){
  30.                      printf("nErrore nella read di [password]: CONNESSIONE FALLITAn");
  31.                      return -1;
  32.                  }
  33.                  else{
  34. 					  printf("La read di [password] è fallitan");
  35.                       return -1;
  36.                  }
  37.             }
  38.             printf("Errore system call read [password]n");
  39.         }
  40.  
  41.         //Cerco l'utente
  42.         Utente temp = cercaUtente(utente);
  43.  
  44.  
  45.         //Utente trovato
  46.         if((strcmp(utente.nickname, temp.nickname) == 0) && (strcmp(utente.password, temp.password) == 0)){
  47. 			while(write(sock,"OK", CONFERMA) < = 0){
  48. 				if(errno != EINTR){
  49. 					if(errno == ECONNRESET || errno == EPIPE){
  50. 						printf("nErrore nella write di [ok]: CONNESSIONE FALLITAn");
  51. 						return -1;
  52. 					}
  53. 					else{
  54. 						printf("La write di [ok] è fallitan");
  55. 						return -1;
  56. 					}
  57. 				}
  58. 				printf("Errore system call write [ok]n");
  59. 			}
  60.  
  61. 			memset(utente.nickname, 0, sizeof(utente.nickname));
  62.             memset(utente.password, 0, sizeof(utente.password));
  63.  
  64.             //Invio il permesso al client
  65.  
  66.             int permesso = temp.permesso;
  67.  
  68.             write(sock,&permesso,4);
  69.  
  70. 			return temp.permesso;
  71. 		}
  72.  
  73. 		//Utente non trovato
  74. 		else {
  75. 			while(write(sock,"NO", CONFERMA) < = 0){
  76. 				if(errno != EINTR){
  77. 					if(errno == ECONNRESET || errno == EPIPE){
  78. 						printf("nErrore nella write di [no]: CONNESSIONE FALLITAn");
  79. 						return -1;
  80. 					}
  81. 					else{
  82. 						printf("La write di [no] è fallitan");
  83. 						return -1;
  84. 					}
  85. 				}
  86. 				printf("Errore system call write [no]n");
  87. 			}
  88.  
  89. 			--tentativi;
  90.  
  91. 			printf("nHai ancora %d tentativi a disposizionen", tentativi);
  92.  
  93. 			memset(utente.nickname, 0, sizeof(utente.nickname));
  94.             memset(utente.password, 0, sizeof(utente.password));
  95. 		}
  96. 	}
  97.  
  98. 	printf("nLogin fallito dopo 3 tentativin");
  99. 	return -1;
  100. }
Intervento di Loris Stefano a.k.a. javoso89 del 19-07-2012 ore 14:37, Fossacesia (CH)
Plebeo
Plebeo
(38 interventi)
Iscritto il 21-04-2011
Se a qualcuno può interessare ho fatto 1 po di debug. Il server sembra funzionare ed invia correttamente "NO" al client se ci si logga con nome utente/password non esistenti ma il client entra dentro l'if che gestisce la ricezione di "OK" e non so spiegarmelo.
Intervento di Filippo P a.k.a. lieutenant del 22-07-2012 ore 20:20, Treviglio (BG)
Cavaliere
Cavaliere
(143 interventi)
Iscritto il 11-01-2006
javoso89 ha scritto:
Se a qualcuno può interessare ho fatto 1 po di debug. Il server sembra funzionare ed invia correttamente "NO" al client se ci si logga con nome utente/password non esistenti ma il client entra dentro l'if che gestisce la ricezione di "OK" e non so spiegarmelo.

Senza un compilatore ne' un editor sotto mano, sembra impossibile anche a me.


Come hai determinato che entra in quell'if? Dal valore di ritorno della funzione login sul client, dal fatto che vedi scritto "Login effettuato con successo" oppure proprio tramite un debugger mettendo un punto di interruzione all'interno dell'if (sempre del client)?

A meno che l'indentazione non mi abbia tratto in inganno, noto un problema con la funzione login del client: se la stringa che legge non è ne' OK ne NO, la login che valore restituisce?
Intervento di Loris Stefano a.k.a. javoso89 del 23-07-2012 ore 16:37, Fossacesia (CH)
Plebeo
Plebeo
(38 interventi)
Iscritto il 21-04-2011
lieutenant ha scritto:
javoso89 ha scritto:
Se a qualcuno può interessare ho fatto 1 po di debug. Il server sembra funzionare ed invia correttamente "NO" al client se ci si logga con nome utente/password non esistenti ma il client entra dentro l'if che gestisce la ricezione di "OK" e non so spiegarmelo.

Senza un compilatore ne' un editor sotto mano, sembra impossibile anche a me.


Come hai determinato che entra in quell'if? Dal valore di ritorno della funzione login sul client, dal fatto che vedi scritto "Login effettuato con successo" oppure proprio tramite un debugger mettendo un punto di interruzione all'interno dell'if (sempre del client)?

A meno che l'indentazione non mi abbia tratto in inganno, noto un problema con la funzione login del client: se la stringa che legge non è ne' OK ne NO, la login che valore restituisce?

Non ho ancora specificato un comportamento per quel caso. Comunque sia facendo un po di prove (settando il contenuto di conferma nel login del client a "NO"), dopo la read di conferma essa viene settata ad "OK" nonostante nel server sia entrato nell'else dove c'è la write di "NO".

Entra in quell'if semplicemente perché stampo il contenuto di "Conferma" ed esegue anche la stampa relativa all'if.
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.358 secondi.