From 758d24ff553ef73a4c6b4fd6673f3b077bde8c06 Mon Sep 17 00:00:00 2001 From: pfaure Date: Sun, 7 Feb 2021 13:31:21 +0100 Subject: [PATCH] SERVEUR ET CLIENT OK : Nouvelle version du serveur avec un tableau --- Client.c | 133 +++++++++++++++++++----- Serveur.c | 294 +++++++++++++++++++++--------------------------------- attaque.c | 8 +- makefile | 21 ++-- 4 files changed, 236 insertions(+), 220 deletions(-) diff --git a/Client.c b/Client.c index 4e7b617..f654702 100644 --- a/Client.c +++ b/Client.c @@ -12,13 +12,9 @@ #include /* la lib standard */ #include -/* pour le fork */ -#include /* pour memcpy */ #include - -/* pour le scanf permissif */ -#define SIZE_MAX 32767 +#include int main (int argc, char * argv[]) { @@ -55,29 +51,116 @@ int main (int argc, char * argv[]) { exit(1); } - printf("Que souhaitez vous faire : [PRINT|ADD|SUB|MUL|DIV|RESET|GET]\n"); + printf("Que souhaitez vous faire : \n - READ 'index'\n - WRITE 'value' 'index'\n - ADD 'index1' 'index2' 'index3'\n - SUB 'index1' 'index2' 'index3'\n - MUL 'index1' 'index2' 'index3'\n - DIV 'index1' 'index2' 'index3'\n - LOWER 'index1' 'index2'\n - EQUAL 'index1' 'index2'\n - PRINT\n - QUIT\n"); + + int cont = 1; + while (cont) { - // Lecture de la requette - char buff[SIZE_MAX]; - scanf("%s", buff); + // Lecture de la requette + char requette[40]; + fgets(requette, 40, stdin); + char req[10] = "\0"; + int param1 = -1; + int param2 = -1; + int param3 = -1; + sscanf(requette, "%s %d %d %d", req, ¶m1, ¶m2, ¶m3); - // Envoi de la requette - send(sock, buff, strlen(buff), 0); - // Si arg en envoyer ou réponse a recevoir - if (!strcmp(buff, "ADD") || !strcmp(buff, "SUB") || !strcmp(buff, "MUL") || !strcmp(buff, "DIV")) { - printf("Veuillez saisir l'argument\n"); - // Lecture de l'argument - int arg; - scanf("%d", &arg); - // Envoi de la requette - sprintf(buff, "%d", arg); - send(sock, buff, strlen(buff), 0); - } else if (!strcmp(buff, "GET")) { - char buffer[SIZE_MAX]; - read(sock, buffer, SIZE_MAX); - printf("La valeur est : %s\n", buffer); - } + char buff[40] = "\0"; + if (!strcmp(req, "READ")) { + if (param1 < 0) { + printf("ERROR SYNTAX\n"); + } else { + sprintf(buff, "r.%d.0.0", param1); + send(sock, buff, strlen(buff), 0); + + read(sock, buff, 40); + printf("Tableau[%d] = %s\n", param1, buff); + } + } else if (!strcmp(req, "WRITE")) { + if (param2 < 0) { + printf("ERROR SYNTAX\n"); + } else { + sprintf(buff, "w.%d.%d.0", param1, param2); + send(sock, buff, strlen(buff), 0); + } + } else if (!strcmp(req, "ADD")) { + if (param1 < 0 || param2 < 0 || param3 < 0) { + printf("ERROR SYNTAX\n"); + } else { + sprintf(buff, "a.%d.%d.%d", param1, param2, param3); + send(sock, buff, strlen(buff), 0); + } + } else if (!strcmp(req, "SUB")) { + if (param1 < 0 || param2 < 0 || param3 < 0) { + printf("ERROR SYNTAX\n"); + } else { + sprintf(buff, "s.%d.%d.%d", param1, param2, param3); + send(sock, buff, strlen(buff), 0); + } + } else if (!strcmp(req, "MUL")) { + if (param1 < 0 || param2 < 0 || param3 < 0) { + printf("ERROR SYNTAX\n"); + } else { + sprintf(buff, "m.%d.%d.%d", param1, param2, param3); + send(sock, buff, strlen(buff), 0); + } + } else if (!strcmp(req, "DIV")) { + if (param1 < 0 || param2 < 0 || param3 < 0) { + printf("ERROR SYNTAX\n"); + } else { + sprintf(buff, "d.%d.%d.%d", param1, param2, param3); + send(sock, buff, strlen(buff), 0); + } + } else if (!strcmp(req, "LOWER")) { + if (param1 < 0 || param2 < 0) { + printf("ERROR SYNTAX\n"); + } else { + sprintf(buff, "l.%d.%d.0", param1, param2); + send(sock, buff, strlen(buff), 0); + + char retour[2]; + read(sock, retour, 2); + char res[6]; + if (!strcmp(retour, "1")) { + strcpy(res, "TRUE"); + } else if (!strcmp(retour, "0")) { + strcpy(res, "FALSE"); + } else { + strcpy(res, "ERROR"); + } + printf("Tableau[%d] < Tableau[%d] => %s\n", param1, param2, res); + } + } else if (!strcmp(req, "EQUAL")) { + if (param1 < 0 || param2 < 0) { + printf("ERROR SYNTAX\n"); + } else { + sprintf(buff, "e.%d.%d.0", param1, param2); + send(sock, buff, strlen(buff), 0); + + char retour[2]; + read(sock, retour, 2); + char res[6]; + if (!strcmp(retour, "1")) { + strcpy(res, "TRUE"); + } else if (!strcmp(retour, "0")) { + strcpy(res, "FALSE"); + } else { + strcpy(res, "ERROR"); + } + printf("Tableau[%d] == Tableau[%d] => %s\n", param1, param2, res); + } + } else if (!strcmp(req, "PRINT")) { + sprintf(buff, "p.0.0.0"); + send(sock, buff, strlen(buff), 0); + } else if (!strcmp(req, "QUIT")) { + sprintf(buff, "q.0.0.0"); + send(sock, buff, strlen(buff), 0); + cont = 0; + } else { + printf("SYNTAX ERROR\n"); + } + } close(sock); return 0; diff --git a/Serveur.c b/Serveur.c index 041e6f8..0c9c6c0 100644 --- a/Serveur.c +++ b/Serveur.c @@ -13,57 +13,33 @@ #include /* pour le fork */ #include - -/* pour la SHM */ -#include -#include +#include /* pour la manipulation des strings */ #include -/* pour le read permissif */ -#define SIZE_MAX 32767 +/* Taille du tableau d'int fourni au client */ +#define SIZE_TAB 128 -// Pour la SHM -union semun { - int val; /* Value for SETVAL */ - struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ - unsigned short *array; /* Array for GETALL, SETALL */ - struct seminfo *__buf; /* Buffer for IPC_INFO - (Linux-specific) */ -}; +#define NB_SEP 65 +#define NB_PAR_LIGNE 16 -// L'adresse de la SHM en variable globale pour qu'elle soit accessible depuis les fonctions -int * addr_shm; - -// fonctions de manipulation de la SHM -void print_shm() { - printf("La valeur est : %d\n", *addr_shm); + + + //printf("BEFORE: %p\n", __builtin_return_address(0)); + +void handle_sigsegv(int signum) +{ + fprintf(stderr,"Signal SIGSEGV (%d) received : SEG FAULT\n", signum); + _exit(0); } -void add(int n) { - *addr_shm += n; -} - -void sub(int n) { - *addr_shm -= n; -} - -void mul(int n) { - *addr_shm *= n; -} - -void divi(int n) { - *addr_shm /= n; -} - -void reset() { - printf("Hello ça marche\n"); - *addr_shm = 0; -} - -int get() { - return *addr_shm; +int min(int a, int b) { + if (a