Il client funge

This commit is contained in:
Claudio Maggioni 2018-01-05 21:44:22 +01:00
parent b7b42264fc
commit 08af938d9a
3 changed files with 109 additions and 113 deletions

View file

@ -1,23 +1,28 @@
HEADERS = gamedata.h HEADERS = gamedata.h
ODIR = out ODIR = out
_OBJ = gamedata.o server.o _OBJ_S = gamedata.o server.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) OBJ_S = $(patsubst %,$(ODIR)/%,$(_OBJ_S))
TDIR = out _OBJ_C = client.o
_TARGET = server OBJ_C = $(patsubst %,$(ODIR)/%,$(_OBJ_C))
TARGET = $(TDIR)/$(_TARGET)
TARGET = out/server
TARGET_C = out/client
CC = gcc CC = gcc
CFLAGS = -g -Wall CFLAGS = -g -Wall
default: server default: client server
$(ODIR)/%.o: %.c $(HEADERS) $(ODIR)/%.o: %.c $(HEADERS)
$(CC) $(CFLAGS) -c $< -o out/$@ $(CC) $(CFLAGS) -c $< -o $@
server: $(OBJ) server: $(OBJ_S)
$(CC) $(OBJ) -o $(TARGET) $(CC) $(OBJ_S) -o $(TARGET)
client: $(OBJ_C)
$(CC) $(OBJ_C) -o $(TARGET_C)
clean: clean:
-rm -f $(OBJ) $(TARGET) -rm -f $(OBJ_S) $(OBJ_C) $(TARGET) $(TARGET_C)

183
client.c
View file

@ -6,13 +6,12 @@
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <unistd.h> #include <unistd.h>
#include <stdbool.h>
#include <ctype.h> #include <ctype.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <errno.h> #include <errno.h>
#define SOCKET_ERROR ((int)-1) #define MAXSIZE 100
#define SERVER_PORT 1313 // numero di porta del server
#define MAXSIZE 10
static struct termios old, new; static struct termios old, new;
@ -92,124 +91,120 @@ int menu() {
for(int i=0;i<4;i++)printf("| |\n"); for(int i=0;i<4;i++)printf("| |\n");
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(); 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++;
if(c==45 && x==6) x=0; if(c==45 && x==6) x=0;
if(c==43 && x>=0) x--; if(c==43 && x>=0) x--;
if(c==43 && x==-1) x=5; if(c==43 && x==-1) x=5;
}while(c!=10); } while(c != '\n');
return c;
return x;
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int scelta=0;
char buffer[MAXSIZE]; char buffer[MAXSIZE];
char indirizzoServer[]="127.0.0.1"; // indirizzo del server char messaggio[MAXSIZE]; // messaggio da inviare
char messaggio[]; // messaggio da inviare
struct sockaddr_in locale, remoto; struct sockaddr_in locale, remoto;
int socketfd; // identificatore della socket int socketfd; // identificatore della socket
int msglen, ris;
int n, nread, nwrite, len;
double prezzo;
int bitto,farina;
/* 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"); printf ("Connessione col server\n");
socketfd = socket(AF_INET, SOCK_STREAM, 0); socketfd = socket(AF_INET, SOCK_STREAM, 0);
if (socketfd == SOCKET_ERROR) { if (socketfd == -1) {
printf ("ERRORE\n"); perror("ERRORE");
return(1); 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_addr.s_addr = htonl(INADDR_ANY);
locale.sin_port = htons(0); locale.sin_port = htons(0);
ris = bind(socketfd, (struct sockaddr*) &locale, sizeof(locale)); int ris = bind(socketfd, (struct sockaddr*) &locale, sizeof(locale));
if (ris == SOCKET_ERROR) { if (ris == -1) {
printf ("ERRORE\n"); perror("ERRORE");
return(3); exit(3);
} }
/* assegnazione parametri del server */ // assegnazione parametri del server
memset ( &remoto, 0, sizeof(remoto) ); memset (&remoto, 0, sizeof(remoto));
remoto.sin_family = AF_INET; remoto.sin_family = AF_INET;
remoto.sin_addr.s_addr = inet_addr(indirizzoServer); remoto.sin_addr.s_addr = inet_addr(argv[1]);
remoto.sin_port = htons(SERVER_PORT); remoto.sin_port = htons(atoi(argv[2]));
//connessione //connessione
ris = connect(socketfd, (struct sockaddr*) &remoto, sizeof(remoto)); ris = connect(socketfd, (struct sockaddr*) &remoto, sizeof(remoto));
if (ris == SOCKET_ERROR) { if (ris == -1) {
perror("fallimento di connect(): "); perror("fallimento di connect(): ");
printf ("fallimento nella connect() failed, errore: %d \"%s\"\n",errno,strerror(errno)); exit(4);
fflush(stdout); //forza la scrittura dei dati bufferizzati sullo stream
return(4);
} }
do{
fflush(stdout); FILE* in = fdopen(socketfd, "r");
scelta=menu(); FILE* out = fdopen(socketfd, "w");
if(scelta==0) int scelta = -1;
messaggio="make\n";
if(scelta==1) while(true) {
messaggio="sell\n"; switch(scelta = menu()) {
if(scelta==2){ case 0:
scanf("%lf",&prezzo); printf("\nInserisci quanti pizzoccheri produrre (intero positivo): ");
messaggio="set price"+prezzo+"\n"; unsigned int pizz;
} scanf("%u", &pizz);
if(scelta==3){ sprintf(messaggio, "make %d\n", pizz);
scanf("%u",&bitto); break;
messaggio="buy bitto"+bitto; case 1:
} strcpy(messaggio, "sell\n");
if(scelta==4){ printf("\n");
scanf("%u",&farina); break;
messaggio="buy flour"+farina; 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;
} }
/* scrittura => invio del messaggio al server */ int n = fprintf(out, messaggio);
len = strlen(messaggio)+1; if(n <= 0) {
nwrite=0; perror("errore operazione di write()");
printf ("lunghezza messaggio %d write()\n", len); exit(5);
}
fflush(out);
fgets(buffer, MAXSIZE, in);
printf("server: %s\n", buffer);
fflush(stdout); fflush(stdout);
while( (n=write(socketfd, &(messaggio[nwrite]), len-nwrite)) >0 ) printf("Premere un tasto per continuare...");
nwrite+=n; if(scelta != 1) getch(); // pulisci buffer da invio della scanf
if(n<0) { getch();
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);
} }

View file

@ -9,7 +9,6 @@
#include <stdbool.h> #include <stdbool.h>
#include "gamedata.h" #include "gamedata.h"
#define SERVER_ADDR htonl(INADDR_ANY)
#define MAX_CLIENTS 100 #define MAX_CLIENTS 100
#define MAX_COMMAND_LINE_LENGTH 101 #define MAX_COMMAND_LINE_LENGTH 101
@ -19,8 +18,8 @@ bool prefix(const char *pre, const char *str) {
int main(int argc, char** argv) { int main(int argc, char** argv) {
if(argc < 2) { if(argc < 3) {
fprintf(stderr, "Give port number as $1\n"); fprintf(stderr, "Give server addr as $1 and port as $2\n");
exit(255); exit(255);
} }
@ -35,8 +34,8 @@ int main(int argc, char** argv) {
memset(&server, 0, sizeof(server)); // zero the memory memset(&server, 0, sizeof(server)); // zero the memory
server.sin_family = AF_INET; server.sin_family = AF_INET;
server.sin_addr.s_addr = SERVER_ADDR; server.sin_addr.s_addr = inet_addr(argv[1]);
server.sin_port = htons(atoi(argv[1])); server.sin_port = htons(atoi(argv[2]));
if(bind(sock_conn_d, (struct sockaddr*)&server, sizeof(server)) == -1) { if(bind(sock_conn_d, (struct sockaddr*)&server, sizeof(server)) == -1) {
perror("server socket not bound"); perror("server socket not bound");
@ -71,13 +70,10 @@ int main(int argc, char** argv) {
else if(pid == 0) { else if(pid == 0) {
gamedata_t *curr_data = gamedata_new(); 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* in = fdopen(sock_data_d, "r");
FILE* out = fdopen(dup(sock_data_d), "w"); FILE* out = fdopen(dup(sock_data_d), "w");
fprintf(out, "OK Connection establshed.\n");
fflush(out);
while(true) { while(true) {
fgets(command, MAX_COMMAND_LINE_LENGTH, in); fgets(command, MAX_COMMAND_LINE_LENGTH, in);