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