This commit is contained in:
Lorenzo Bianchi 2023-05-16 23:27:27 +02:00
parent 5f197dc386
commit 3ce987fe90
5 changed files with 102 additions and 38 deletions

View File

@ -67,6 +67,6 @@ ARGSCLIENT := test
test: server client
server:
gcc src/F4Server.c src/custom_sem.c src/custom_shm.c src/custom_signal.c src/errExit.c src/forza4.c src/server.c -o bin/F4Server -I inc/
gcc src/F4Server.c src/custom_sem.c src/custom_shm.c src/custom_signal.c src/errExit.c src/forza4.c src/server.c src/nonsodovemetterle.c -o bin/F4Server -I inc/
client:
gcc src/F4Client.c src/custom_sem.c src/custom_shm.c src/custom_signal.c src/errExit.c src/forza4.c src/server.c -o bin/F4Client -I inc/
gcc src/F4Client.c src/custom_sem.c src/custom_shm.c src/custom_signal.c src/errExit.c src/forza4.c src/nonsodovemetterle.c -o bin/F4Client -I inc/

View File

@ -35,7 +35,6 @@ typedef struct {
long mtype; // type 1
int player_id;
input_server_t server_in;
char *name_player1, *name_player2;
} msg_t;
typedef struct {
@ -43,4 +42,12 @@ typedef struct {
int move;
} move_t;
typedef struct {
long mtype; // type 3
int id;
char *name_player;
} player_names_t;
#define MAX_NAME 16
#endif

View File

@ -12,8 +12,7 @@
#include <structures.h>
#include <custom_shm.h>
#include <errExit.h>
void printfClient(char *msg);
#include <nonsodovemetterle.h>
tile_t *boardClient = NULL;
@ -27,11 +26,14 @@ void sigHandlerClient(int sig) {
if (sig == SIGTERM) {
// shm
if (boardClient) {
printf("\n");
printfClient("Detathing shm");
if (shmdt(boardClient) == -1) {
errExit("shmdt", "sigHandlerServer");
}
}
printf("\n");
}
exit(0);
@ -41,6 +43,8 @@ void sigHandlerClient(int sig) {
//TODO: mettere main ma non l'ho fatto per makefile
int main(int argc, char *argv[]){
//TODO: controllo input
input_server_t input;
// SIGNAL
@ -90,7 +94,7 @@ int main(int argc, char *argv[]){
printfClient("Setting up sem\n");
key_t semKey = ftok(KEYFILE, 'S');
int semid;
if ((semid = semget(semKey, 2, S_IRUSR | S_IWUSR | IPC_CREAT)) == -1) {
if ((semid = semget(semKey, 3, S_IRUSR | S_IWUSR | IPC_CREAT)) == -1) {
errExit("getsem", "F4Client");
}
//
@ -98,26 +102,37 @@ int main(int argc, char *argv[]){
semOp(semid, 0, -1); // aspetta che il server gli dia il permesso di connettersi
semOp(semid, msg.player_id, -1); // aspetta che il server gli dia il permesso di connettersi
printfClient("Connecting to server...\n");
semOp(semid, 2, 1); // finito operazioni di connessione
semOp(semid, 1, -1); // finito operazioni di connessione
// mando il mio nome al server
printf("%s\n", argv[1]);
player_names_t name = {.mtype = 3, .id = msg.player_id, .name_player = argv[1]};
if (msgsnd(msgid, &name, sizeof(player_names_t) - sizeof(long), 0) == -1) {
errExit("msgsnd", "mandare nome");
}
printfClient("Searching for oponent...\n");
//partita
while (1) { //FIXME: potenzialmente da cambiare
move_t move = {.mtype = 2};
// PARTITA
while (1) { //FIXME: potenzialmente da cambiare questo while (ma forse bastano i segnali)
semOp(semid, msg.player_id, -1); // aspetto il mio turno
printfServer("Tocca a te: \n");
scanf("%d", &move.move);
if (msgsnd(msgid, &move, sizeof(move_t) - sizeof(long), 0) == -1) {
errExit("msgsnd", "partita_client");
}
}
return 0;
}
void printfClient(char *string){
printf("\033[94m<Client>\033[39m %s", string);
}

View File

@ -14,6 +14,7 @@
#include <custom_shm.h>
#include <errExit.h>
#include <forza4.h>
#include <nonsodovemetterle.h>
int semid = 0;
int msgid = 0;
@ -21,8 +22,6 @@ int shmid = 0;
tile_t *board = NULL;
void printfServer(char *msg);
void sigHandlerServer(int sig) {
if (sig == SIGINT) {
//TODO:
@ -34,9 +33,9 @@ void sigHandlerServer(int sig) {
if (sig == SIGTERM) {
//TODO: killare figli
printf("\n");
// msgq
if (msgid) {
printf("\n");
printfServer("Deleting msg\n");
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
errExit("msgctl", "sigHandlerServer");
@ -45,7 +44,8 @@ void sigHandlerServer(int sig) {
// sem
if (semid) {
printfServer("Deleting sem\n");
printf("\n");
printfServer("Deleting sem");
if (semctl(semid, 0, IPC_RMID, 0) == -1) {
errExit("semctl", "sigHandlerServer");
}
@ -53,16 +53,21 @@ void sigHandlerServer(int sig) {
// shm
if (board) {
printfServer("Deleting and detathing shm");
printf("\n");
printfServer("Detathing shm");
if (shmdt(board) == -1) {
errExit("shmdt", "sigHandlerServer");
}
}
if (shmid){
printf("\n");
printfServer("Deleting shm");
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
errExit("shmctl", "SigHandlerSever");
}
}
printf("\n");
}
exit(0);
@ -106,12 +111,12 @@ int main(int argc, char *argv[]){
};
// msgsnd
if (msgsnd(msgid, &msg, sizeof(msg_t)-sizeof(long), 0) == -1) {
if (msgsnd(msgid, &msg, sizeof(msg_t) - sizeof(long), 0) == -1) {
errExit("msgsnd1", "F4Server");
}
msg.player_id = 1;
if (msgsnd(msgid, &msg, sizeof(msg_t)-sizeof(long), 0) == -1) {
if (msgsnd(msgid, &msg, sizeof(msg_t) - sizeof(long), 0) == -1) {
errExit("msgsnd2", "F4Server");
}
@ -126,7 +131,7 @@ int main(int argc, char *argv[]){
//
printfServer("Setting up sem\n");
key_t semKey = ftok(KEYFILE, 'S');
semid = semget(semKey, 2, S_IRUSR | S_IWUSR | IPC_CREAT);
semid = semget(semKey, 3, IPC_CREAT | S_IRUSR | S_IWUSR);
if (semid == -1) {
errExit("getsem", "F4Server");
}
@ -135,16 +140,53 @@ int main(int argc, char *argv[]){
//
semOp(semid, 0, 1); // aperurta semaforo per connessione dei due client
semOp(semid, 0, 1);
// aperurta semaforo per connessione dei due client
printfServer("Waiting for players...\n");
semOp(semid, 1, 0); // aspetto che si connettano i due client
semOp(semid, 0, 1);
semOp(semid, 1, 1);
// aspetto che si connettano i due client
//FIXME: forse non serve perche tanto deve aspettare che i player gli mandono un messaggio con il loro nome (a cose servono i semafori se ci sono i messaggi che fanno l'attesa non in polling aaaaaaaaa)
semOp(semid, 2, -1);
player_names_t names; // lo so si possono usare nomi piu chiari ma problema tuo (mi riferisco a te e me futuro)
char **name = (char**)malloc(2 * sizeof(char *)); //FIXME: non riesco a farlo statico
for (int h=0; h<2; h++) {
name[h] = (char*)malloc(MAX_NAME * sizeof(char));
}
// ricevuta nome primo client
if (msgrcv(msgid, &names, sizeof(player_names_t) - sizeof(long), 3, 0) == -1) {
errExit("msgrcv", "ricevuta primo nome");
}
printf("TEST\n");
printf("%d\n", names.id);
printf("%s\n", names.name_player);
name[names.id] = names.name_player;
printf("%s\n", names.name_player);
printfServer("Player ");
printf("%s connected\n", name[names.id]); //
// aspetto secondo client
semOp(semid, 2, -1);
// ricevuta nome secondo client
if (msgrcv(msgid, &names, sizeof(player_names_t) - sizeof(long), 3, 0) == -1) {
errExit("msgrcv", "ricevuta secondo nome");
}
name[names.id] = names.name_player;
printfServer("Player ");
printf("%s connected\n", name[names.id]);
// PARTITA
printfServer("Starting game\n");
// faccio quello che devo fare
int turns_left = input.rows * input.collums;
int turn = 0;
move_t move;
@ -153,13 +195,17 @@ int main(int argc, char *argv[]){
semOp(semid, turn, 1);
turn = (turn + 1) % 2; // FIXME: si puo scrivere meglio?
printfServer("Player");
printf("%d turn\n", turn);
printfServer("");
printf("%s's turn\n", name[turn]);
if (msgrcv(msgid, &move, sizeof(move_t) - sizeof(long), 2, 0) == -1) {
errExit("msgrcv", "F4Client");
}
//TMP
printf("move: %d\n", move.move);
printf("turns left: %d\n", turns_left - 1);
} while (--turns_left && !checkWin(board, move.move, input.rows, input.collums));
@ -175,7 +221,3 @@ int main(int argc, char *argv[]){
return 0;
}
void printfServer(char *string){
printf("\033[94m<Server>\033[39m %s", string);
}

View File

@ -24,7 +24,7 @@ int getSemid(key_t key, int size){
// mette i semafori a 0 e 2
void resetServerSem(int semid){
unsigned short val[2] = {0, 2}; // STO PENSANDO DI METTERE 1 1 PERCHE NON VUOLE FUNZIONARE MA ADESSO DEVO CENARE
unsigned short val[3] = {0, 0, 0}; // player1, player2, server
union semun arg;
arg.array = val;