PDA

Visualizza la versione completa : [C]Implementare un login da client a server


Javino89
22-03-2012, 14:34
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 :)

oregon
22-03-2012, 19:16
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:user:pwd

e il server li riconosce. Tutto qui.

Javino89
22-03-2012, 20:31
Dai credo di essermi fatto un'idea, quando ho un po più di codice o se ho problemi riposterò qui xD

Javino89
23-03-2012, 16:51
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?

oregon
23-03-2012, 19:11
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.

Javino89
29-03-2012, 15:31
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 :D qualsiasi suggerimento o modifica è ben accetto :)



#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);
}

Loading