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

    [C]Implementare un login da client a server

    Vorrei fare questo:

    1) Apro il server
    2) Apro il client che si connette al server
    3) A connessione avvenuta il client deve effettuare un login tramite l'inserimento di un nome e di una password che il server provvederà a controllare e a dare un risultato: login ok, login non ok

    Ho imparato ad inviare semplici messaggi tra client e server tramite la send e la recv ma qui condividono una funzione, come devo comportarmi?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Beh, non vedo tante differenze con quello che hai già fatto.

    A parte tutti i discorsi sulla "sicurezza" effettiva di un login simile (ovvero invio delle password in chiaro, adozione di particolari sistemi ...) all'atto della connessione puoi inviare un messaggio con utenza e password e ottenere la risposta dal server.

    Non devi "condividere una funzione" ma stabilire un protocollo.

    Dal client invii specifici messaggi con dei "comandi", ad esempio

    LOGIN:userwd

    e il server li riconosce. Tutto qui.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Dai credo di essermi fatto un'idea, quando ho un po più di codice o se ho problemi riposterò qui xD

  4. #4
    Ecco allora mi serve un suggerimento:

    Nel client ho la funzione login(socket) che si occupa dell'acquisizione di nome utente e password, dell'invio
    dei suddetti al server e dell'attesa della risposta del server stesso. Come faccio? Creo una struct condivisa, magari
    in un file.h dove salvo i dati che vengono letti dal server una volta che "si rende conto" che non sono nulli oppure
    invio direttamente tramite la send?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Javino89
    Ecco allora mi serve un suggerimento:
    Invia i dati con la send e attendi una stringa come OK o NONOK ... ne avevamo già parlato.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Allora ho abbozzato un client (da completare), dei pareri mi farebbero piacere, la compilazione avviene con successo ma ho una valanga di warning e righe sottolineate in rosso. Non posso far ancora girare il codice perché devo implementare ancora un server base..

    Per favore un'occhiatina qualsiasi suggerimento o modifica è ben accetto

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/wait.h>
    #include <signal.h>
    
    #define PORT 3490
    #define MAXDATASIZE 100
    
    int main(int argc, char **argv)
    {
    	int my_sock, numbytes;
    	struct sockaddr_in my_addr;
    	char msg[MAXDATASIZE];
    	
    	//Creo il socket
    	
    	my_sock = socket(PF_INET, SOCK_STREAM, 0);
    	if(my_sock == -1)
    	{
    		perror("Errore nella creazione del socket");
    		exit(1);
    	}
    	
    	my_addr.sin_family = AF_INET;
    	my_addr.sin_port = htons(PORT);
    	my_addr.sin_addr.s_addr = INADDR_ANY;
    	memset(my_addr.sin_zero, '\0', sizeof(my_addr.sin_zero));
    	
    	//Mi connetto al server
    	
    	if(connect(my_sock, (struct sockaddr*)&my_addr, sizeof my_addr) == -1) 
    	{
    		perror("Errore nella connect");
    		exit(1);
    	}
    	else printf("CLIENT: Connessione eseguita con successo");
    	printf("\n");
    	
    	int log = login(my_sock); 
    	
    	if(log == 0)
        {
    		printf("Login negato.");
    		chiusura();
    	}
    	
    	if(log == 1) 
    	{
    		printf("Client: Puoi effettuare solo una ricerca");
    		exit(1);
    	}
    	
    	if(log == 2)
        {
    		printf("Client: Puoi effettuare solo un aggiornamento");
    		exit(1);
    	}
    	
    	if(log == 3 ) 
    	{
    		int scelta;
    		
    		printf("Client: Puoi effettuare sia ricerca sia un aggiornamento\n");
    		printf("Digitare 1 per cercare, 2 per aggiungere\n");
    		scanf("%d\n", &scelta);
    		
    		if(scelta == 1)
    		{
    			printf("RICERCA\n");
    			exit(1);
    		}
    		
    		if(scelta == 2)
    		{
    			printf("AGGIORNAMENTO\n");
    			exit(1);
    		}
    		
    		else 
    		{
    			printf("Errore, devi digitare 1 o 2");
    			chiusura();
    		}
    		
    		exit(1);
    	}
    	
    	close(my_sock);
    	
    	return 0;
    }
    
    int login(int my_sock)
    {
    	int tentativi = 3;
    	char risp[MAXDATASIZE]; //Risposta del server
    	
    	printf("Effettua il login\n");
    	
    	char nome[20]; //Nome utente
    	int pwd;       //Password utente
    	
    	while(tentativi < 3) 
    	{
    	
    		//Acquisizione dati
    	    
    		printf("Inserisci il nome: ");
    		scanf("%s", nome);
    		fflush(stdout);
    	
    		printf("\nInserisci la password: ");
    		scanf("%d", &pwd);
    		fflush(stdout);
    		
    		//Invio i dati
    		
    		while(send(my_sock, nome, strlen(nome),0) <= 0)
    		{
    			if(errno != EINTR)
    			{
                    if(errno == ECONNRESET || errno == EPIPE)
                    {
                        printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso.");
                        fflush(stdout);
                        return 0;
                    }
                    else
                    {
                        printf("La read è fallita\n");
                        fflush(stdout);
                        perror("Errore di tipo");
                        fflush(stdout);
                        return 0;
                    }
                }
                printf("Errore durante la system call\n");
                fflush(stdout);
    		}
    		
    		while(send(my_sock, pwd, sizeof(pwd), 0) <= 0)
    		{
    			if(errno != EINTR)
    			{
                    if(errno == ECONNRESET || errno == EPIPE)
                    {
                        printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso.");
                        fflush(stdout);
                        return 0;
                    }
                    else
                    {
                        printf("La read è fallita\n");
                        fflush(stdout);
                        perror("Errore di tipo");
                        fflush(stdout);
                        return 0;
                    }
                }
                printf("Errore durante la system call.");
                fflush(stdout);
            }   
            
            //Arriva la risposta del server
                
            while(recv(my_sock, risp, sizeof(risp),0) <= 0)
            {
    			if(errno != EINTR)
    			{
                    if(errno == ECONNRESET || errno == EPIPE)
                    {
                         printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso.");
                         fflush(stdout);
                         return 0;
                    }
                    else
                    {
                         printf("La read è fallita\n");
                         fflush(stdout);
                         perror("Errore di tipo");
                         fflush(stdout);
                         return 0;
                    }
                }
                printf("Errore durante la system call.\n");
                fflush(stdout);
    		}
                
            //Controllo la risposta (OKU, OKD, OKT, NONOK)
                
            if(strcmp(risp,"OKU") == 0)
            {
    			printf("Login effettuato con successo\n");
    			memset(risp,0,sizeof(risp));
    			return 1;
    		}
            if(strcmp(risp,"OKD") == 0)
            {
    			printf("Login effettuato con successo\n");
    			memset(risp,0,sizeof(risp));
    			return 2;
    		}
    		if(strcmp(risp,"OKT") == 0)
            {
    			printf("Login effettuato con successo\n");
    			memset(risp,0,sizeof(risp));
    			return 3;
    		}
    		if(strcmp(risp,"NONOK") == 0)
    		{
    			printf("Login non corretto, username o password errate\n");
    			memset(risp,0,sizeof(risp));
    			tentativi--;
    			if(tentativi == 2)
    			{
    				printf("Hai ancora 2 tentativi\n");
    			}
    			if(tentativi == 1)
    			{
    				printf("Hai ancora 1 tentativo\n");
    			}
    			premiInvio();
    		}
    	}
    	if(tentativi == 0)
    	{
    	    printf("Non puoi più effettuare il login, effettua di nuovo l'accesso.\n");
    		chiusura();
    	}
    }
    
    void premiInvio()
    {
        printf("\nPremere INVIO per continuare...\n");
     
        /* Svuoto l'input buffer */
        while (getchar() != '\n');
     
        /* Leggo dallo stdin SOLO \n */
        while(scanf("%*[^\n]") == -1)
        {
            if(errno != EINTR)
            {
                printf("\nErrore scanf\n");
                chiusura();
    		}
        }
    }
    
    void chiusura()
    {
            printf("CHIUSURA CLIENT IN CORSO...\n");
            fflush(stdout);
            printf("CLIENT CHIUSO CORRETTAMENTE");
            fflush(stdout);
            exit(0);
    }

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.