diff --git a/header/bal.h b/header/bal.h index faadbe4..a173347 100644 --- a/header/bal.h +++ b/header/bal.h @@ -3,10 +3,12 @@ #include "tsock.h" +int bal(void); + typedef struct{ char *data; int tailleData; - int idEmeteur; + int idEmetteur; }messageBAL; struct elementMessage{ @@ -20,11 +22,47 @@ 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); int bal(void); +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); +/** + * @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/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/header/tsock.h b/header/tsock.h index 8e51d59..2f6e7d3 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 968e00d..62780aa 100644 --- a/src/bal.c +++ b/src/bal.c @@ -1,18 +1,27 @@ #include "../header/bal.h" int bal(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"); + 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; } -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 +36,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 +63,123 @@ 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); + if(testExistInList) + { + ajoutListeMessage(elementNouveauMessage->BALActuel->actualMessages,creeMessage(data,idEmetteur)); + } + else + { + struct listeMessage * newListMessage = initListeMessage(); + 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 diff --git a/src/main.c b/src/main.c index 1523e2c..f0163a6 100644 --- a/src/main.c +++ b/src/main.c @@ -4,25 +4,25 @@ int main (int argc, char **argv) { + char usageChar[100]="usage: cmd [-p|-s]|[-u][-u|-r ##|-e ##|-b][-n ##][-l ##] port ipAdress\n"; testProtocol(); - char usageChar[30]="usage: cmd [-p|-s][-n ##]\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; @@ -36,21 +36,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) @@ -69,7 +97,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)