edi sega a smash

This commit is contained in:
Lorenzo Bianchi 2023-05-16 18:43:56 +02:00
parent d674dbbc7f
commit 5196c1a526
4 changed files with 77 additions and 28 deletions

View File

@ -20,6 +20,8 @@ TARGET1 := $(BIN_DIR)/F4Server
TARGET2 := $(BIN_DIR)/F4Client
INCLUDE := -I $(INC_DIR)
ARGS := 6 7 O X
# [--------------------FUNCTION--------------------]
# SRCS extract all file in src/
@ -35,7 +37,7 @@ all: execute
#---------------------------------------------------
execute: linking_s linking_c
@ echo execute...
@ ./$(TARGET1)
@ ./$(TARGET1) $(ARGS)
@ echo ...terminate
#---------------------------------------------------
linking_s: $(OBJS) $(BIN_DIR)

View File

@ -12,15 +12,25 @@
#include <custom_shm.h>
#include <errExit.h>
void printfClient(char *msg);
tile_t *boardClient = NULL;
void sigHandlerClient(int sig) {
if (sig == SIGINT) {
//TODO:
sig = SIGTERM;
}
if (sig == SIGTERM) {
//TODO: in teoria non fa niente di speciale qua, in quanto il server dovrebbe chiudere tutto
// invece no ce almeno la detach da fare
// shm
if (boardClient) {
printfClient("Detathing shm");
if (shmdt(boardClient) == -1) {
errExit("shmdt", "sigHandlerServer");
}
}
}
exit(0);
@ -28,11 +38,12 @@ void sigHandlerClient(int sig) {
//TODO: mettere main ma non l'ho fatto per makefile
int client(){
int client(int argc, char *argv[]){
input_server_t input;
// SIGNAL
printfClient("Setting up signal\n");
sigset_t mySet;
sigfillset(&mySet);
sigdelset(&mySet, SIGINT);
@ -48,6 +59,7 @@ int client(){
//
// MSGQ
printfClient("Setting up msgq\n");
key_t msgKey = ftok(KEYFILE, 'M');
int msgid = msgget(msgKey, IPC_CREAT | S_IRUSR | S_IWUSR);
if (msgid == -1) {
@ -58,6 +70,7 @@ int client(){
msg_t msg;
// msgrcv
printfClient("Waiting for message...\n");
if (msgrcv(msgid, &msg, sizeof(msg_t) - sizeof(long), 1, 0) == -1) {
errExit("msgrcv", "F4Client");
}
@ -67,11 +80,13 @@ int client(){
// SHM
printfClient("Setting up shm\n");
int shmBoardid = getShmid(input.rows, input.collums);
tile_t *board = shmClientAt(shmBoardid);
boardClient = shmClientAt(shmBoardid);
//
// SEM
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) {
@ -84,18 +99,24 @@ int client(){
semOp(semid, 0, -1); // aspetta che il server gli dia il permesso di connettersi
printf("\033[94m<Client>\033[39m Connecting to server...\n");
printfClient("Connecting to server...\n");
semOp(semid, 1, -1); // finito operazioni di connessione
printfClient("Searching for oponent...\n");
//partita
while (1) { //FIXME: potenzialmente da cambiare
semOp(semid, msg.player_id, -1); // aspetto il mio turno
}
return 0;
}
void printfClient(char *string){
printf("\033[94m<Client>\033[39m%s", string);
}

View File

@ -15,40 +15,54 @@
#include <errExit.h>
#include <forza4.h>
int semid = 0;
int msgid = 0;
int shmid = 0;
int semid;
int msgid;
int shmid;
tile_t *board = NULL;
tile_t *board;
void printfServer(char *msg);
void sigHandlerServer(int sig) {
if (sig == SIGINT) {
//TODO:
// per il secondo SIGINT basta modificare il sig in SIGTERM
sig = SIGTERM; // per il secondo SIGINT basta modificare il sig in SIGTERM
}
if (sig == SIGTERM) {
//TODO: killare figli
printf("\n");
// msgq
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
errExit("msgctl", "sigHandlerServer");
if (msgid) {
printfServer("Deleting msg\n");
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
errExit("msgctl", "sigHandlerServer");
}
}
// sem
if (semctl(semid, 0, IPC_RMID, 0) == -1) {
errExit("semctl", "sigHandlerServer");
if (semid) {
printfServer("Deleting sem\n");
if (semctl(semid, 0, IPC_RMID, 0) == -1) {
errExit("semctl", "sigHandlerServer");
}
}
// shm
if (shmdt(board) == -1) {
errExit("shmdt", "sigHandlerServer");
if (board) {
printfServer("Deleting and detathing shm");
if (shmdt(board) == -1) {
errExit("shmdt", "sigHandlerServer");
}
}
if (shmid){
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
errExit("shmctl", "SigHandlerSever");
}
}
if (shmctl(shmid, IPC_RMID, NULL) == -1)
errExit("shmctl", "SigHandlerSever");
}
exit(0);
@ -59,6 +73,7 @@ int main(int argc, char *argv[]){
input_server_t input = check_input(argc, argv);
// SIGNAL
printfServer("Setting up signals\n");
sigset_t mySet;
sigfillset(&mySet);
sigdelset(&mySet, SIGINT);
@ -75,8 +90,9 @@ int main(int argc, char *argv[]){
// MSGQ
printfServer("Setting up msgq\n");
//TODO: forse bisogna fare il reset della shm, perche in teoria mette a 0 quando crea
// ma nel caso in cui il campo non si fosse chiuso per qualche motivo forse quando lo riapre non lo azzera
//ma nel caso in cui il campo non si fosse chiuso per qualche motivo forse quando lo riapre non lo azzera
key_t msgKey = ftok(KEYFILE, 'M');
msgid = msgget(msgKey, IPC_CREAT | S_IRUSR | S_IWUSR);
if (msgid == -1){
@ -102,11 +118,13 @@ int main(int argc, char *argv[]){
//
// SHM
printfServer("Setting up shm\n");
shmid = getShmid(input.rows, input.collums);
board = shmServerAt(shmid);
//
// SEM
//
printfServer("Setting up sem\n");
key_t semKey = ftok(KEYFILE, 'S');
semid = semget(semKey, 2, S_IRUSR | S_IWUSR | IPC_CREAT);
if (semid == -1) {
@ -117,8 +135,9 @@ int main(int argc, char *argv[]){
//
semOp(semid, 0, 2); // aperurta semaforo per connessione dei due client
printfServer("Waiting for players...\n");
semOp(semid, 0, 0); // aspetto che si connettano i due client
@ -132,6 +151,9 @@ 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);
if (msgrcv(msgid, &move, sizeof(move_t) - sizeof(long), 2, 0) == -1) {
errExit("msgrcv", "F4Client");
}
@ -150,4 +172,8 @@ int main(int argc, char *argv[]){
//TODO: end of game
return 0;
}
void printfServer(char *string){
printf("\033[94m<Server>\033[39m %s", string);
}

View File

@ -3,7 +3,7 @@
#include <structures.h>
void setCollums(int rows) {
void setRows(int rows) {
_ROWS = rows;
}
@ -39,17 +39,17 @@ int checkWin(tile_t *board, int pos, int rows, int collums) {
return board[pos];
}
int result = checkLine(board, pos, VERTICAL);
result = checkLine(board, pos, VERTICAL);
if (result) {
return board[pos];
}
int result = checkLine(board, pos, DIAGONAL);
result = checkLine(board, pos, DIAGONAL);
if (result) {
return board[pos];
}
int result = checkLine(board, pos, DIAGONAL_INV);
result = checkLine(board, pos, DIAGONAL_INV);
if (result) {
return board[pos];
}