/* Client.c */
#include "macro.h"
#include "funzioniClient.h"
#include "Client.h"
void stampaMenu(){
/* Stampo il menù principale del client (in formato colorato) */
while(printf("\033[01;34m---------------------------------\n") == -1
){
if(errno != EINTR){
chiusuraClient();
}
}fflush(stdout);
while(printf("-----------\033[00;34mMENU CLIENT\033[01;34m-----------\n") == -1
){
if(errno != EINTR){
chiusuraClient();
}
}fflush(stdout);
while(printf("---------------------------------\033[00m\n\n") == -1
){
if(errno != EINTR){
chiusuraClient();
}
}fflush(stdout);
while(printf("\033[01;33m 1. Trova numero di telefono\033[00m\n") == -1
){
if(errno != EINTR){
chiusuraClient();
}
}fflush(stdout);
while(printf("\033[00;33m 2. Aggiungi numero di telefono\033[00m\n") == -1
){
if(errno != EINTR){
chiusuraClient();
}
}fflush(stdout);
if(errno != EINTR){
chiusuraClient();
}
}fflush(stdout);
while(printf(" 3. ESCI\n") == -1
){
if(errno != EINTR){
chiusuraClient();
}
}fflush(stdout);
while(printf("\n\033[01;34m---------------------------------\n") == -1
){
if(errno != EINTR){
chiusuraClient();
}
}fflush(stdout);
while(printf("---------------------------------") == -1
){
if(errno != EINTR){
chiusuraClient();
}
}fflush(stdout);
while(printf("\n---------------------------------\033[00m\n") == -1
){
if(errno != EINTR){
chiusuraClient();
}
}fflush(stdout);
}
int menu(){
int modalita;
int testscanf;
/* Stampo il menù principale del client */
stampaMenu();
printf("\033[01;32mSelezionare l'opzione...\033[00m\n");fflush
(stdout
);
/* Seleziono l'opzione desiderata scartando quelle "illegali" */
do{
testscanf = scanf("%d", &modalita);
while(-1 == testscanf){
if(errno != EINTR){
chiusuraClient();
}
else{
testscanf = scanf("%d", &modalita);
}
}
if(testscanf == 0 || modalita>3 || modalita<1){ // Ho scelto un'opzione "illegale"
while(scanf("%*[^\n]") == -1){ // Svuoto l'input buffer
if(errno != EINTR){
chiusuraClient();
}
}
printf("Opzione non valida...\n");fflush
(stdout
);
void premiInvio();
stampaMenu();
printf("Selezionare l'opzione...\n\n");fflush
(stdout
);
}
} while(testscanf == 0 || modalita>3 || modalita<1);
/* Ritorno il valore dell'opzione selezionata*/
return modalita;
}
int main(int argc, char** argv){
if(argc != 3){
printf("\033[01;31m\nERRORE - Avviare il programma usando il comando: \033[00m%s [Indirizzo IP] [Porta]", argv
[0
]);fflush
(stdout
);
chiusuraClient();
}
else{
/* Imposto la gestione dei segnali asincroni */
signal(SIGINT, chiusuraClient);
signal(SIGQUIT, chiusuraClient);
signal(SIGILL, chiusuraClient);
signal(SIGSEGV, chiusuraClient);
signal(SIGTERM, chiusuraClient);
/* Ignoro il segnale SIGPIPE */
signal(SIGPIPE, SIG_IGN);
printf("\n\nInizializzazione client in corso...\n");fflush
(stdout
);
struct sockaddr_in target;
/* Resetto la struct target */
memset(&target, 0, sizeof(target));
/* Stabilisco l'indirizzo IP del server (secondo argomento da linea di comando, il protocollo utilizzato e il port number (terzo argomento da linea di comando*/
if(-1 == (inet_aton(argv[1], (struct in_addr *) (&target.sin_addr))) ){
printf("\nErrore: indirizzo IP non valido!\n\n");fflush
(stdout
);
chiusuraClient();
}
target.sin_family = AF_INET;
target.sin_port = htons(atoi(argv[2]));
/* Creo il socket */
int sock;
printf("\nCreazione socket in corso...");fflush
(stdout
);
if(-1 == (sock = socket(AF_INET, SOCK_STREAM, 0))){
printf("\nErrore: Impossibile creare il socket!");fflush
(stdout
);
chiusuraClient();
}
/* Mi connetto al server */
if(-1 == (connect(sock, (struct sockaddr *) &target, sizeof(target)))){
printf("\nErrore: tentativo di connettersi a %s alla porta %s fallito", argv
[1
], argv
[2
]);fflush
(stdout
);
chiusuraClient();
}
printf("Inizializzazione completata con successo\n");
/* Effettuo il login */
int loginOK;
loginOK = login(sock);
if(loginOK == 1){
int opzione;
while(1){
/* Seleziono l'opzione dal menù principale */
opzione = menu();
/* Chiamo la funzione specifica per l'opzione selezionata */
/* Opzione "Trova record" */
if(opzione==1){
if(trovaRecord(sock) == 1){
/* Informo il server che voglio continuare con una richiesta */
while(write(sock, "OK", RISPOSTA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
chiusuraClient();
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
chiusuraClient();
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
}
else{
printf("\nIl server non risponde, è offline\n");
chiusuraClient();
}
}
/* Opzione "Aggiungi record" */
if(opzione==2){
if(aggiungiRecord(sock) == 1){
/* Informo il server che voglio continuare con una richiesta */
while(write(sock, "OK", RISPOSTA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
chiusuraClient();
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
chiusuraClient();
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
}
else{
printf("\nIl server non risponde, è offline\n");
chiusuraClient();
}
}
if(opzione==3){
/* Informo il server che ho terminato le richieste... */
while(write(sock, "OFF", RISPOSTA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
chiusuraClient();
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
chiusuraClient();
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
/* ...e chiudo il client */
chiusuraClient();
}
}
}
/* La connessione si è interrotta improvvisamente */
else{
printf("\nIl server non risponde, è offline");
chiusuraClient();
}
}
}