From 08af938d9ae0505fa7a6316ca9337380fa78e574 Mon Sep 17 00:00:00 2001 From: praticamentetilde Date: Fri, 5 Jan 2018 21:44:22 +0100 Subject: [PATCH] Il client funge --- Makefile | 25 +++++--- client.c | 183 +++++++++++++++++++++++++++---------------------------- server.c | 14 ++--- 3 files changed, 109 insertions(+), 113 deletions(-) diff --git a/Makefile b/Makefile index 33329b6..d44b3c7 100644 --- a/Makefile +++ b/Makefile @@ -1,23 +1,28 @@ HEADERS = gamedata.h ODIR = out -_OBJ = gamedata.o server.o -OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) +_OBJ_S = gamedata.o server.o +OBJ_S = $(patsubst %,$(ODIR)/%,$(_OBJ_S)) -TDIR = out -_TARGET = server -TARGET = $(TDIR)/$(_TARGET) +_OBJ_C = client.o +OBJ_C = $(patsubst %,$(ODIR)/%,$(_OBJ_C)) + +TARGET = out/server +TARGET_C = out/client CC = gcc CFLAGS = -g -Wall -default: server +default: client server $(ODIR)/%.o: %.c $(HEADERS) - $(CC) $(CFLAGS) -c $< -o out/$@ + $(CC) $(CFLAGS) -c $< -o $@ -server: $(OBJ) - $(CC) $(OBJ) -o $(TARGET) +server: $(OBJ_S) + $(CC) $(OBJ_S) -o $(TARGET) + +client: $(OBJ_C) + $(CC) $(OBJ_C) -o $(TARGET_C) clean: - -rm -f $(OBJ) $(TARGET) + -rm -f $(OBJ_S) $(OBJ_C) $(TARGET) $(TARGET_C) diff --git a/client.c b/client.c index f3d6f63..2514b6c 100644 --- a/client.c +++ b/client.c @@ -6,13 +6,12 @@ #include #include #include +#include #include #include #include -#define SOCKET_ERROR ((int)-1) -#define SERVER_PORT 1313 // numero di porta del server -#define MAXSIZE 10 +#define MAXSIZE 100 static struct termios old, new; @@ -92,124 +91,120 @@ int menu() { for(int i=0;i<4;i++)printf("| |\n"); printf("+-------------------------------------------------------------------------------------------------------------+\n"); - printf(" Usa '+' per salire, '-' per scendere e 'INVIO' per selezionare la voce"); - + printf(" Usare 1-6 o +/- per spostarsi e \\n per selezionare."); c = (int)getch(); - if(c>=49 && c<=53) x=c-49; + if(c>=49 && c<=54) x=c-49; if(c==45 && x<6) x++; if(c==45 && x==6) x=0; if(c==43 && x>=0) x--; if(c==43 && x==-1) x=5; - }while(c!=10); - return c; + } while(c != '\n'); + + return x; } int main(int argc, char *argv[]) { - int scelta=0; char buffer[MAXSIZE]; - char indirizzoServer[]="127.0.0.1"; // indirizzo del server - char messaggio[]; // messaggio da inviare + char messaggio[MAXSIZE]; // messaggio da inviare struct sockaddr_in locale, remoto; - int socketfd; // identificatore della socket - int msglen, ris; - int n, nread, nwrite, len; - double prezzo; - int bitto,farina; + int socketfd; // identificatore della socket - /* impostazione del transport endpoint */ + if(argc < 3) { + fprintf(stderr, "Inserire l'indirizzo come primo argomento e la porta come secondo\n"); + exit(255); + } + + // impostazione del transport endpoint printf ("Connessione col server\n"); socketfd = socket(AF_INET, SOCK_STREAM, 0); - if (socketfd == SOCKET_ERROR) { - printf ("ERRORE\n"); - return(1); + if (socketfd == -1) { + perror("ERRORE"); + exit(1); } - memset ( &locale, 0, sizeof(locale) ); - locale.sin_family = AF_INET; + + memset (&locale, 0, sizeof(locale)); + locale.sin_family = AF_INET; locale.sin_addr.s_addr = htonl(INADDR_ANY); locale.sin_port = htons(0); - ris = bind(socketfd, (struct sockaddr*) &locale, sizeof(locale)); - if (ris == SOCKET_ERROR) { - printf ("ERRORE\n"); - return(3); + int ris = bind(socketfd, (struct sockaddr*) &locale, sizeof(locale)); + if (ris == -1) { + perror("ERRORE"); + exit(3); } - /* assegnazione parametri del server */ - memset ( &remoto, 0, sizeof(remoto) ); - remoto.sin_family = AF_INET; - remoto.sin_addr.s_addr = inet_addr(indirizzoServer); - remoto.sin_port = htons(SERVER_PORT); + // assegnazione parametri del server + memset (&remoto, 0, sizeof(remoto)); + remoto.sin_family = AF_INET; + remoto.sin_addr.s_addr = inet_addr(argv[1]); + remoto.sin_port = htons(atoi(argv[2])); + //connessione ris = connect(socketfd, (struct sockaddr*) &remoto, sizeof(remoto)); - if (ris == SOCKET_ERROR) { + if (ris == -1) { perror("fallimento di connect(): "); - printf ("fallimento nella connect() failed, errore: %d \"%s\"\n",errno,strerror(errno)); - fflush(stdout); //forza la scrittura dei dati bufferizzati sullo stream - return(4); + exit(4); } - do{ - fflush(stdout); - scelta=menu(); - if(scelta==0) - messaggio="make\n"; - if(scelta==1) - messaggio="sell\n"; - if(scelta==2){ - scanf("%lf",&prezzo); - messaggio="set price"+prezzo+"\n"; - } - if(scelta==3){ - scanf("%u",&bitto); - messaggio="buy bitto"+bitto; + + FILE* in = fdopen(socketfd, "r"); + FILE* out = fdopen(socketfd, "w"); + int scelta = -1; + + while(true) { + switch(scelta = menu()) { + case 0: + printf("\nInserisci quanti pizzoccheri produrre (intero positivo): "); + unsigned int pizz; + scanf("%u", &pizz); + sprintf(messaggio, "make %d\n", pizz); + break; + case 1: + strcpy(messaggio, "sell\n"); + printf("\n"); + break; + case 2: + printf("\nInserisci nuovo prezzo in CHF (decimale): "); + double prezzo; + scanf("%lf",&prezzo); + sprintf(messaggio, "set price %lf\n", prezzo); + break; + case 3: + printf("\nInserisci quanto bitto comprare (intero positivo): "); + unsigned int bitto; + scanf("%u",&bitto); + sprintf(messaggio, "buy bitto %d\n", bitto); + break; + case 4: + printf("\nInserisci quanta farina comprare (intero positivo): "); + unsigned int farina; + scanf("%u",&farina); + sprintf(messaggio, "buy flour %d\n", farina); + break; + case 5: + printf("\nChiusura in corso..."); + fprintf(out, "exit\n"); + fclose(in); + fclose(out); + exit(0); + default: + continue; } - if(scelta==4){ - scanf("%u",&farina); - messaggio="buy flour"+farina; + + int n = fprintf(out, messaggio); + if(n <= 0) { + perror("errore operazione di write()"); + exit(5); } - - /* scrittura => invio del messaggio al server */ - len = strlen(messaggio)+1; - nwrite=0; - printf ("lunghezza messaggio %d write()\n", len); + fflush(out); + + fgets(buffer, MAXSIZE, in); + printf("server: %s\n", buffer); fflush(stdout); - while( (n=write(socketfd, &(messaggio[nwrite]), len-nwrite)) >0 ) - nwrite+=n; - if(n<0) { - char msgerror[1024]; - sprintf(msgerror,"errore operazione di write()[err %d] ",errno); - perror(msgerror); - return(5); - } - - printf("stringa spedita: %s\n", messaggio); - fflush(stdout); //forza la scrittura dei dati bufferizzati sullo stream - - /* lettura della risposta */ - nread=0; - printf ("read()\n"); - while( (len>nread) && ((n=read(socketfd, &(buffer[nread]), len-nread )) >0)) - { - nread+=n; // aggiorna il numero di byte letti - printf("read effettuata, risultato n=%d len=%d nread=%d \n", n, len, nread); - } - if(n<0) // si e' verificato un errore - { - char msgerror[1024]; - sprintf(msgerror,"errore in lettura read() [err %d] ",errno); - perror(msgerror); // visualizza la descrizione dell'errore - return(6); - } - - /* stampa risultato */ - printf("stringa ricevuta: %s\n", buffer); - fflush(stdout); //forza la scrittura dei dati bufferizzati sullo stream - }while(scelta!=5); - - /* chiusura socket */ - close(socketfd); - - return(0); + printf("Premere un tasto per continuare..."); + if(scelta != 1) getch(); // pulisci buffer da invio della scanf + getch(); + } } diff --git a/server.c b/server.c index 3b0f7df..656f475 100644 --- a/server.c +++ b/server.c @@ -9,7 +9,6 @@ #include #include "gamedata.h" -#define SERVER_ADDR htonl(INADDR_ANY) #define MAX_CLIENTS 100 #define MAX_COMMAND_LINE_LENGTH 101 @@ -19,8 +18,8 @@ bool prefix(const char *pre, const char *str) { int main(int argc, char** argv) { - if(argc < 2) { - fprintf(stderr, "Give port number as $1\n"); + if(argc < 3) { + fprintf(stderr, "Give server addr as $1 and port as $2\n"); exit(255); } @@ -35,8 +34,8 @@ int main(int argc, char** argv) { memset(&server, 0, sizeof(server)); // zero the memory server.sin_family = AF_INET; - server.sin_addr.s_addr = SERVER_ADDR; - server.sin_port = htons(atoi(argv[1])); + server.sin_addr.s_addr = inet_addr(argv[1]); + server.sin_port = htons(atoi(argv[2])); if(bind(sock_conn_d, (struct sockaddr*)&server, sizeof(server)) == -1) { perror("server socket not bound"); @@ -71,13 +70,10 @@ int main(int argc, char** argv) { else if(pid == 0) { gamedata_t *curr_data = gamedata_new(); - unsigned char command[MAX_COMMAND_LINE_LENGTH]; + char command[MAX_COMMAND_LINE_LENGTH]; FILE* in = fdopen(sock_data_d, "r"); FILE* out = fdopen(dup(sock_data_d), "w"); - fprintf(out, "OK Connection establshed.\n"); - fflush(out); - while(true) { fgets(command, MAX_COMMAND_LINE_LENGTH, in);