From cfd79b575d43aa7ffb19f76e09934db86e13b8f7 Mon Sep 17 00:00:00 2001 From: Yohan Boujon Date: Mon, 16 Jan 2023 18:26:37 +0100 Subject: [PATCH 1/3] =?UTF-8?q?Completion=20de=20la=20liste=20de=20liste?= =?UTF-8?q?=20en=20bo=C3=AEte=20aux=20lettres.=20fonction=20nouveauMessage?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- header/bal.h | 33 +++++++++++++-- header/tsock.h | 1 + src/bal.c | 110 +++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 128 insertions(+), 16 deletions(-) diff --git a/header/bal.h b/header/bal.h index 23bacce..d97310e 100644 --- a/header/bal.h +++ b/header/bal.h @@ -6,7 +6,7 @@ typedef struct{ char *data; int tailleData; - int idEmeteur; + int idEmetteur; }messageBAL; struct elementMessage{ @@ -20,10 +20,35 @@ struct listeMessage{ struct elementMessage * fin; }; -messageBAL * creeMessage(char *data,int idEmeteur); +typedef struct{ + int idRecepteur; + struct listeMessage * actualMessages; +}BAL; + +struct elementBAL{ + BAL * BALActuel; + struct elementBAL * suiv; +}; + +struct listeBAL{ + struct elementBAL * debut; + struct elementBAL * courant; + struct elementBAL * fin; +}; + +messageBAL * creeMessage(char *data,int idEmetteur); struct elementMessage * initElementMessage(void); -struct listeMessage initListeMessage(void); -void ajoutListe(struct listeMessage * listeActuel,messageBAL * leMessage); +struct listeMessage * initListeMessage(void); +void ajoutListeMessage(struct listeMessage * listeActuel,messageBAL * leMessage); void afficheListeMessage(struct listeMessage listeActuel); +BAL * creerBAL(int idRecepteur, struct listeMessage * messageRecepteur); +struct elementBAL * initElementBAL(void); +struct listeBAL initListeBAL(void); +void ajoutListeBAL(struct listeBAL * listeActuel,BAL * laBoiteAuxLettres); +void afficheListeBAL(struct listeBAL listeActuel); + +struct elementBAL * existInListBAL(struct listeBAL listeActuel, int idRecepteur, bool * boolRetour); +void nouveauMessage(struct listeBAL * b,int idEmetteur,int idRecepteur,char *data); + #endif \ No newline at end of file diff --git a/header/tsock.h b/header/tsock.h index e67c1a2..c0037ec 100644 --- a/header/tsock.h +++ b/header/tsock.h @@ -12,6 +12,7 @@ #include #include #include +#include void setNbMessage(int * nb, int source); void printInfo(int source, int isTCP, int nbMessage, int taille, int portNumber, char ipAddress[]); diff --git a/src/bal.c b/src/bal.c index 7b8b94e..f74ca0b 100644 --- a/src/bal.c +++ b/src/bal.c @@ -1,18 +1,22 @@ #include "../header/bal.h" int main(void){ - struct listeMessage l = initListeMessage(); - messageBAL * messageBAL = creeMessage("Renvoi moi mon pdf asap. -Simon",1); - ajoutListe(&l,messageBAL); - afficheListeMessage(l); + struct listeBAL boiteAuxLettres = initListeBAL(); + nouveauMessage(&boiteAuxLettres,2,1,"Renvoi moi mon pdf asap. -Simon"); + nouveauMessage(&boiteAuxLettres,2,1,"Mon anniversaire c'est demain !"); + nouveauMessage(&boiteAuxLettres,1,2,"Ok joyeux anniv alors !"); + nouveauMessage(&boiteAuxLettres,1,2,"ok c'est fait. -Yohan"); + nouveauMessage(&boiteAuxLettres,3,1,"C'est trop, yohan me soule"); + nouveauMessage(&boiteAuxLettres,1,3,"Yoyo l'asticot"); + afficheListeBAL(boiteAuxLettres); return 0; } -messageBAL * creeMessage(char *data,int idEmeteur) +messageBAL * creeMessage(char *data,int idEmetteur) { messageBAL * message = malloc(sizeof(messageBAL)); - message->idEmeteur=idEmeteur; + message->idEmetteur=idEmetteur; message->tailleData=strlen(data); message->data=(char*)malloc(sizeof(char)*message->tailleData); strcpy(message->data,data); @@ -27,16 +31,16 @@ struct elementMessage * initElementMessage(void) return returnElement; } -struct listeMessage initListeMessage(void) +struct listeMessage * initListeMessage(void) { - struct listeMessage l; - l.debut=initElementMessage(); - l.fin=initElementMessage(); - l.courant=initElementMessage(); + struct listeMessage * l=malloc(sizeof(struct listeMessage)); + l->debut=initElementMessage(); + l->fin=initElementMessage(); + l->courant=initElementMessage(); return l; } -void ajoutListe(struct listeMessage * listeActuel,messageBAL * leMessage) +void ajoutListeMessage(struct listeMessage * listeActuel,messageBAL * leMessage) { struct elementMessage * elementActuel = malloc(sizeof(struct elementMessage)); elementActuel->messageBALActuel=leMessage; @@ -54,4 +58,86 @@ void afficheListeMessage(struct listeMessage listeActuel) printf("%s\n",elementCourant->messageBALActuel->data); elementCourant=elementCourant->suiv; } +} + +BAL * creerBAL(int idRecepteur, struct listeMessage * messageRecepteur) +{ + BAL * boiteAuxLettres = malloc(sizeof(BAL)); + + boiteAuxLettres->idRecepteur=idRecepteur; + boiteAuxLettres->actualMessages=messageRecepteur; + return boiteAuxLettres; +} + +struct elementBAL * initElementBAL(void) +{ + struct elementBAL * returnElement = malloc(sizeof(struct elementBAL)); + struct listeMessage * lVide = initListeMessage(); + returnElement->BALActuel = creerBAL(0,lVide); + returnElement->suiv = NULL; + return returnElement; +} + +struct listeBAL initListeBAL(void) +{ + struct listeBAL l; + l.debut=initElementBAL(); + l.fin=initElementBAL(); + l.courant=initElementBAL(); + return l; +} + +void ajoutListeBAL(struct listeBAL * listeActuel,BAL * laBoiteAuxLettres) +{ + struct elementBAL * elementActuel = malloc(sizeof(struct elementBAL)); + elementActuel->BALActuel=laBoiteAuxLettres; + elementActuel->suiv=listeActuel->courant; + listeActuel->debut=elementActuel; + listeActuel->courant=elementActuel; +} + +void afficheListeBAL(struct listeBAL listeActuel) +{ + struct elementBAL * elementFinal = listeActuel.fin; + struct elementBAL * elementCourant = listeActuel.courant; + while(elementCourant->suiv != elementFinal->suiv) + { + printf("Recepteur : %d\n",elementCourant->BALActuel->idRecepteur); + afficheListeMessage(*(elementCourant->BALActuel->actualMessages)); + elementCourant=elementCourant->suiv; + } +} + +struct elementBAL * existInListBAL(struct listeBAL listeActuel, int idRecepteur, bool * boolRetour) +{ + struct elementBAL * elementFinal = listeActuel.fin; + struct elementBAL * elementCourant = listeActuel.courant; + while(elementCourant->suiv != elementFinal->suiv) + { + if(elementCourant->BALActuel->idRecepteur == idRecepteur) + { + *boolRetour = true; + return elementCourant; + } + elementCourant=elementCourant->suiv; + }; + *boolRetour = false; + return elementFinal; +} + +void nouveauMessage(struct listeBAL * b,int idEmetteur,int idRecepteur,char *data) +{ + bool testExistInList; + struct elementBAL * elementNouveauMessage = existInListBAL(*b,idRecepteur,&testExistInList); + printf("testExistInList = %d\n",testExistInList); + if(testExistInList) + { + ajoutListeMessage(elementNouveauMessage->BALActuel->actualMessages,creeMessage(data,idEmetteur)); + } + else + { + struct listeMessage * newListMessage = initListeMessage(); + ajoutListeMessage(newListMessage,creeMessage(data,idEmetteur)); + ajoutListeBAL(b,creerBAL(idRecepteur,newListMessage)); + } } \ No newline at end of file From 968cc17e438008782f72774ef1649fa6753cd48b Mon Sep 17 00:00:00 2001 From: Yohan Boujon Date: Tue, 17 Jan 2023 23:51:46 +0100 Subject: [PATCH 2/3] =?UTF-8?q?Ajout=20de=20getMessages=20qui=20r=C3=A9cup?= =?UTF-8?q?=C3=A8re=20une=20liste=20de=20message=20=C3=A0=20partir=20d'un?= =?UTF-8?q?=20id=20recepteur.=20formatListMessage=20formate=20chaque=20mes?= =?UTF-8?q?sage=20et=20l'envoi=20au=20client.=20(WIP)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- header/bal.h | 11 +++++++++++ src/bal.c | 44 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/header/bal.h b/header/bal.h index d97310e..e7e64dc 100644 --- a/header/bal.h +++ b/header/bal.h @@ -50,5 +50,16 @@ void afficheListeBAL(struct listeBAL listeActuel); struct elementBAL * existInListBAL(struct listeBAL listeActuel, int idRecepteur, bool * boolRetour); void nouveauMessage(struct listeBAL * b,int idEmetteur,int idRecepteur,char *data); +/** + * @brief Récupère la liste de message d'un recepteur précis + * Attention de vérifier si la liste est vide -> si c'est le cas, + * alors le recepteur n'existe pas. + * + * @param b liste de BoîteAuxLettres + * @param idRecepteur + * @return struct listeMessage* + */ +struct listeMessage * getMessages(struct listeBAL b, int idRecepteur); +void formatListMessage(struct listeMessage l); #endif \ No newline at end of file diff --git a/src/bal.c b/src/bal.c index f74ca0b..a1700b2 100644 --- a/src/bal.c +++ b/src/bal.c @@ -8,7 +8,12 @@ int main(void){ nouveauMessage(&boiteAuxLettres,1,2,"ok c'est fait. -Yohan"); nouveauMessage(&boiteAuxLettres,3,1,"C'est trop, yohan me soule"); nouveauMessage(&boiteAuxLettres,1,3,"Yoyo l'asticot"); + nouveauMessage(&boiteAuxLettres,4,1,"Cool new mmsg"); afficheListeBAL(boiteAuxLettres); + printf("--- Cote recepteur -> getMessages() ---\n"); + afficheListeMessage(*getMessages(boiteAuxLettres,1)); + printf("--- Cote recepteur -> formatListMessage() ---\n"); + formatListMessage(*getMessages(boiteAuxLettres,1)); return 0; } @@ -129,7 +134,6 @@ void nouveauMessage(struct listeBAL * b,int idEmetteur,int idRecepteur,char *dat { bool testExistInList; struct elementBAL * elementNouveauMessage = existInListBAL(*b,idRecepteur,&testExistInList); - printf("testExistInList = %d\n",testExistInList); if(testExistInList) { ajoutListeMessage(elementNouveauMessage->BALActuel->actualMessages,creeMessage(data,idEmetteur)); @@ -140,4 +144,42 @@ void nouveauMessage(struct listeBAL * b,int idEmetteur,int idRecepteur,char *dat ajoutListeMessage(newListMessage,creeMessage(data,idEmetteur)); ajoutListeBAL(b,creerBAL(idRecepteur,newListMessage)); } +} + +struct listeMessage * getMessages(struct listeBAL b, int idRecepteur) +{ + bool testExistInList; + struct elementBAL * elementGetMessage = existInListBAL(b,idRecepteur,&testExistInList); + if(testExistInList) + { + return elementGetMessage->BALActuel->actualMessages; + } + else + { + struct listeMessage * receiverDoesntExist = initListeMessage(); + } +} + +void formatListMessage(struct listeMessage l) +{ + struct elementMessage * elementFinal = l.fin; + struct elementMessage * elementCourant = l.courant; + while(elementFinal->suiv != elementCourant->suiv) + { + char numBuff[30]; + sprintf(numBuff, "%d", (elementCourant->messageBALActuel->idEmetteur)%10000); + int tailleNum = strlen(numBuff); + char messageSend[elementCourant->messageBALActuel->tailleData+tailleNum+1]; + for(int i=0;imessageBALActuel->tailleData;i++,j++) + { + messageSend[i]=elementCourant->messageBALActuel->data[j]; + } + messageSend[elementCourant->messageBALActuel->tailleData+tailleNum+1]='\0'; + printf("Data sent : %s\n",messageSend); + elementCourant=elementCourant->suiv; + } } \ No newline at end of file From e24e42a74d1b042e2ee8080c301315399312e302 Mon Sep 17 00:00:00 2001 From: yoboujon Date: Wed, 18 Jan 2023 07:17:56 +0100 Subject: [PATCH 3/3] ajout des commandes -b,-e et -r pour la BAL. Gestion de -b dans puit, ajout de la fonction initSocket. --- header/bal.h | 2 ++ header/puit.h | 3 ++- src/bal.c | 2 +- src/main.c | 44 ++++++++++++++++++++++++++++++++++++-------- src/puit.c | 25 ++++++++++++++++++------- 5 files changed, 59 insertions(+), 17 deletions(-) diff --git a/header/bal.h b/header/bal.h index e7e64dc..204ac2e 100644 --- a/header/bal.h +++ b/header/bal.h @@ -3,6 +3,8 @@ #include "tsock.h" +int bal(void); + typedef struct{ char *data; int tailleData; diff --git a/header/puit.h b/header/puit.h index e9c795a..7cfd3ed 100644 --- a/header/puit.h +++ b/header/puit.h @@ -3,7 +3,8 @@ #include "tsock.h" -int launchPuit(int nombreMessage,int tailleMessage,int isTCP,int port,char * ipAddress); +int launchPuit(int nombreMessage,int tailleMessage,int isTCP,int port,char * ipAddress,int isBAL); +int initSocket(int socketType, struct sockaddr_in * socketStruct, int port, char * ipAddress); int receiveMultipleData(int nombreMessages, int tailleMessage, int sock, struct sockaddr_in socketStruct, int isTCP); #endif \ No newline at end of file diff --git a/src/bal.c b/src/bal.c index a1700b2..62780aa 100644 --- a/src/bal.c +++ b/src/bal.c @@ -1,6 +1,6 @@ #include "../header/bal.h" -int main(void){ +int bal(void){ struct listeBAL boiteAuxLettres = initListeBAL(); nouveauMessage(&boiteAuxLettres,2,1,"Renvoi moi mon pdf asap. -Simon"); nouveauMessage(&boiteAuxLettres,2,1,"Mon anniversaire c'est demain !"); diff --git a/src/main.c b/src/main.c index 34d8175..fdbf2f2 100644 --- a/src/main.c +++ b/src/main.c @@ -4,24 +4,24 @@ int main (int argc, char **argv) { - char usageChar[30]="usage: cmd [-p|-s][-n ##]\n"; + char usageChar[100]="usage: cmd [-p|-s]|[-u][-u|-r ##|-e ##|-b][-n ##][-l ##] port ipAdress\n"; char *ipAddress; extern char *optarg; extern int optind; - int source = -1, nb_message = -1, c, tcp=1, port=-1, tailleMessage=30; /* Nb de messages à envoyer ou à recevoir, par défaut : 10 en émission, infini en réception */ - while ((c = getopt(argc, argv, "pn:sul:")) != -1) { + int source = -1, nb_message = -1, c, tcp=1, port=-1, tailleMessage=30, emetteur=-1, recepteur=-1, isBAL=0; + while ((c = getopt(argc, argv, "pn:sul:e:r:b")) != -1) { switch (c) { case 'p': if (source != -1) { printf("%s",usageChar); - exit(1); + exit(EXIT_FAILURE); } source = 0; break; case 's': if (source != -1) { printf("%s",usageChar); - exit(1) ; + exit(EXIT_FAILURE); } source = 1; break; @@ -35,21 +35,49 @@ int main (int argc, char **argv) case 'u': tcp=0; break; + case 'e': + if(recepteur !=-1 || tcp !=1 || isBAL!=0 || source != -1) + { + printf("%s",usageChar); + exit(EXIT_FAILURE); + } + source = 1; + emetteur = atoi(optarg); + break; + case 'r': + if(emetteur!=-1 || tcp !=1 || isBAL!=0 || source != -1) + { + printf("%s",usageChar); + exit(EXIT_FAILURE); + } + source = 1; + recepteur = atoi(optarg); + break; + case 'b': + if(emetteur!=-1 || recepteur !=-1 || tcp !=1) + { + printf("%s",usageChar); + exit(EXIT_FAILURE); + } + source = 0; + isBAL=1; + break; default: printf("%s",usageChar); + exit(EXIT_FAILURE); break; } } if (source == -1) { printf("-p|-s non present !\n"); printf("%s",usageChar); - exit(1); + exit(EXIT_FAILURE); } if(argc != optind+2) { printf("ip ou port non present !\n"); printf("%s",usageChar); - exit(1); + exit(EXIT_FAILURE); } if(tailleMessage == -1) @@ -68,7 +96,7 @@ int main (int argc, char **argv) else { //printf("Puit : %d\n",nb_message); - launchPuit(nb_message,tailleMessage,tcp,port,ipAddress); + launchPuit(nb_message,tailleMessage,tcp,port,ipAddress,isBAL); } return(EXIT_SUCCESS); } \ No newline at end of file diff --git a/src/puit.c b/src/puit.c index 76e18fa..8614c98 100644 --- a/src/puit.c +++ b/src/puit.c @@ -1,25 +1,36 @@ #include "../header/puit.h" -int launchPuit(int nombreMessage,int tailleMessage,int isTCP,int port,char * ipAddress) +int launchPuit(int nombreMessage,int tailleMessage,int isTCP,int port,char * ipAddress,int isBAL) { int sock,socketType; struct sockaddr_in socketPuit; socketType = (isTCP) ? SOCK_STREAM : SOCK_DGRAM; + sock = initSocket(socketType,&socketPuit,port,ipAddress); + if(isBAL) + { + printf("Mode Boîte aux Lettres\n"); + return 0; + } + receiveMultipleData(nombreMessage,tailleMessage,sock,socketPuit,isTCP); + close(sock); + return 0; +} - if((sock=socket(AF_INET,socketType,0)) == -1) +int initSocket(int socketType, struct sockaddr_in * socketStruct, int port, char * ipAddress) +{ + int sockReturn; + if((sockReturn=socket(AF_INET,socketType,0)) == -1) { perror("[tsock] : fonction socket() : echec creation du socket\n"); exit(EXIT_FAILURE); } - initStructSocket(&socketPuit,0,port,ipAddress); - if (bind(sock, (struct sockaddr *)&socketPuit, sizeof(socketPuit)) < 0 ) + initStructSocket(socketStruct,0,port,ipAddress); + if (bind(sockReturn, (struct sockaddr *)socketStruct, sizeof(*socketStruct)) < 0 ) { perror("[tsock] : fonction bind() : echec du lien avec socket serveur.\n"); exit(EXIT_FAILURE); } - receiveMultipleData(nombreMessage,tailleMessage,sock,socketPuit,isTCP); - close(sock); - return 0; + return sockReturn; } int receiveMultipleData(int nombreMessages, int tailleMessage, int sock, struct sockaddr_in socketStruct, int isTCP)