Il client funge
This commit is contained in:
parent
b7b42264fc
commit
08af938d9a
3 changed files with 109 additions and 113 deletions
25
Makefile
25
Makefile
|
@ -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
183
client.c
|
@ -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");
|
||||||
|
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);
|
int n = fprintf(out, messaggio);
|
||||||
messaggio="buy flour"+farina;
|
if(n <= 0) {
|
||||||
|
perror("errore operazione di write()");
|
||||||
|
exit(5);
|
||||||
}
|
}
|
||||||
|
fflush(out);
|
||||||
/* scrittura => invio del messaggio al server */
|
|
||||||
len = strlen(messaggio)+1;
|
fgets(buffer, MAXSIZE, in);
|
||||||
nwrite=0;
|
printf("server: %s\n", buffer);
|
||||||
printf ("lunghezza messaggio %d write()\n", len);
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
14
server.c
14
server.c
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue