diff --git a/header/iptable.h b/header/iptable.h new file mode 100644 index 0000000..4c4d080 --- /dev/null +++ b/header/iptable.h @@ -0,0 +1,112 @@ +#ifndef HEADER_IPTABLE +#define HEADER_IPTABLE + +#include "tsock.h" + +/** + * @brief Test la liste ipTable + * + * @return int 0-> si réussite. + */ +int iptableTest(); + +/** + * @struct ipTable + * @brief definition de la structure d'une table d'IP + * + * @var ipTable::ipAddress + * Adresse IP sous forme de char* + * @var ipTable::idEmetteur + * Numéro de l'émetteur associé à l'ip + */ +typedef struct{ + char *ipAddress; + int tailleipAddress; + int idEmetteur; +}ipTable; + +/** + * @struct elementipTable + * @brief Element dans une liste de table d'IP + * + * @var elementipTable::actualIpTable + * Pointeur vers la table d'IP de l'élément + * @var elementipTable::suiv + * Pointeur vers le prochain élément + */ +struct elementIpTable{ + ipTable * actualIpTable; + struct elementIpTable * suiv; +}; + +/** + * @struct listeIpTable + * @brief Liste d'éléments table d'IP + * + * @var listeIpTable::debut + * Pointeur vers le premier élément + * @var listeIpTable::courant + * Pointeur vers l'élément sélectionné + * @var listeIpTable::fin + * Pointeur vers l'élément final + */ +struct listeIpTable{ + struct elementIpTable * debut; + struct elementIpTable * courant; + struct elementIpTable * fin; + int taille; +}; + +/** + * @brief Permet l'initialisation d'une struture ipTable avec une IP et un idEmetteur donné. + * + * @param ipAddress char*, Adresse IP associée à l'émétteur. + * @param idEmetteur int, numéro de l'émetteur du message. + * @return ipTable* table d'IP initialisé avec les paramètres donnés. + */ +ipTable * creeIpTable(char *ipAddress,int idEmetteur); + +/** + * @brief Initialise la structure elementIpTable avec un malloc. + * L'élément crée renvoi vers une adresse NULL. + * + * @return struct elementIpTable* element initialisé + */ +struct elementIpTable * initElementIpTable(void); + +/** + * @brief Initialise plusieurs éléments (debut,courant et fin) avec initElementIpTable(). + * + * @return struct listeIpTable* liste de tables d'IP NULL mais alloué. + */ +struct listeIpTable * initListeIpTable(void); + +/** + * @brief Ajoute un tableau d'IP dans la liste de des tableaux d'IP : + * Mets à jour le pointeur courant ainsi que debut. + * + * @param listeActuel struct listeIpTable *,la liste à modifier. + * @param lipTable ipTable*, pointeur sur le tableau d'IP à ajouter à la liste. + */ +void ajoutListeIpTable(struct listeIpTable * listeActuel,ipTable * lipTable); + +/** + * @brief Affiche l'intégralité des IP/Id Emetteurs. + * + * @param listeActuel struct listeIpTable, liste à afficher. + */ +void afficheListeIpTable(struct listeIpTable listeActuel); + +/** + * @brief Permet de vérifier si une Adresse IP existe déjà dans une liste d'IP donnée + * Ne modifie pas le pointeur courant mais parcours toute la liste. Modifie le boolRetour pour savoir si c'est vrai ou non. + * Renvoi l'élément correspondant si c'est le cas. Renvoi un élément vide sinon. + * + * @param listeActuel struct listeBAL, la liste à vérifier + * @param idEmetteur char*, Adresse IP à vérifier. + * @param boolRetour bool*, 1->Element retourné trouvé dans la liste, 0->Element NULL, non trouvé dans la liste + * @return struct elementIpTable*, element trouvé si dans la liste, NULL sinon. + */ +struct elementIpTable * existInListIP(struct listeIpTable listeActuel, char* ipAdress, bool * boolRetour); + +#endif \ No newline at end of file diff --git a/header/puit.h b/header/puit.h index 3819ae6..18bb710 100644 --- a/header/puit.h +++ b/header/puit.h @@ -3,6 +3,7 @@ #include "tsock.h" #include "bal.h" +#include "iptable.h" /** * @brief Fonction principale pour le puit. Peut lancer en mode TCP/UDP avec la fonction receiveMultipleData() @@ -81,4 +82,6 @@ int receptionRecepteur(int sock, int socketType, struct sockaddr_in socketStruct */ int readRecvFrom(int sock, struct sockaddr_in socketStruct, int longueurRecu, char * messageRecu, int tailleMessage, int isTCP, int i); +int getEmetteurId(struct sockaddr_in socketStruct, struct listeIpTable * tabledIp); + #endif \ No newline at end of file diff --git a/src/bal.c b/src/bal.c index 8aa6920..360ca14 100644 --- a/src/bal.c +++ b/src/bal.c @@ -61,7 +61,7 @@ void afficheListeMessage(struct listeMessage listeActuel) struct elementMessage * elementCourant = listeActuel.courant; while(elementCourant->suiv != elementFinal->suiv) { - printf("%s\n",elementCourant->messageBALActuel->data); + printf("Emetteur : %d\t Message : %s\n",elementCourant->messageBALActuel->idEmetteur,elementCourant->messageBALActuel->data); elementCourant=elementCourant->suiv; } } diff --git a/src/iptable.c b/src/iptable.c new file mode 100644 index 0000000..21b0632 --- /dev/null +++ b/src/iptable.c @@ -0,0 +1,76 @@ +#include "../header/iptable.h" + +int iptableTest() +{ + struct listeIpTable * l = initListeIpTable(); + ajoutListeIpTable(l,creeIpTable("localhost",1)); + ajoutListeIpTable(l,creeIpTable("192.168.1.21",2)); + afficheListeIpTable(*l); + return 0; +} + +ipTable * creeIpTable(char *ipAddress,int idEmetteur) +{ + ipTable * iptablevector = malloc(sizeof(ipTable)); + iptablevector->idEmetteur=idEmetteur; + iptablevector->tailleipAddress=strlen(ipAddress); + iptablevector->ipAddress=(char*)malloc(sizeof(char)*iptablevector->tailleipAddress); + strcpy(iptablevector->ipAddress,ipAddress); + return iptablevector; +} + +struct elementIpTable * initElementIpTable(void) +{ + struct elementIpTable * returnElement = malloc(sizeof(struct elementIpTable)); + returnElement->actualIpTable = creeIpTable("",0); + returnElement->suiv = NULL; + return returnElement; +} + +struct listeIpTable * initListeIpTable(void) +{ + struct listeIpTable * l=malloc(sizeof(struct listeIpTable)); + l->debut=initElementIpTable(); + l->fin=initElementIpTable(); + l->courant=initElementIpTable(); + l->taille=0; + return l; +} + +void ajoutListeIpTable(struct listeIpTable * listeActuel,ipTable * lipTable) +{ + struct elementIpTable * elementActuel = malloc(sizeof(struct elementIpTable)); + elementActuel->actualIpTable=lipTable; + elementActuel->suiv=listeActuel->courant; + listeActuel->debut=elementActuel; + listeActuel->courant=elementActuel; + listeActuel->taille=listeActuel->taille+1; +} + +void afficheListeIpTable(struct listeIpTable listeActuel) +{ + struct elementIpTable * elementFinal = listeActuel.fin; + struct elementIpTable * elementCourant = listeActuel.courant; + while(elementCourant->suiv != elementFinal->suiv) + { + printf("Adresse IP : %s\tEmetteur = %d\n",elementCourant->actualIpTable->ipAddress,elementCourant->actualIpTable->idEmetteur); + elementCourant=elementCourant->suiv; + } +} + +struct elementIpTable * existInListIP(struct listeIpTable listeActuel, char* ipAdress, bool * boolRetour) +{ + struct elementIpTable * elementFinal = listeActuel.fin; + struct elementIpTable * elementCourant = listeActuel.courant; + while(elementCourant->suiv != elementFinal->suiv) + { + if(strcmp(elementCourant->actualIpTable->ipAddress,ipAdress) == 0) + { + *boolRetour = true; + return elementCourant; + } + elementCourant=elementCourant->suiv; + }; + *boolRetour = false; + return elementFinal; +} \ No newline at end of file diff --git a/src/puit.c b/src/puit.c index c5754fa..9d08f4d 100644 --- a/src/puit.c +++ b/src/puit.c @@ -27,6 +27,7 @@ void modeBoiteAuxLettres(struct sockaddr_in socketStruct, int socketType, int po Intiialisation de la taille de socketStruct pour les différentes fonctions. Création des 4 variables à récupérer dans la couche protocolaire.*/ struct listeBAL boiteAuxLettres = initListeBAL(); + struct listeIpTable * tabledIP = initListeIpTable(); char paramRecu[13]; int n, longueurRecu = sizeof(socketStruct),sock,oldSock; int param,emetteurRecepteur,tailleMessage,nbMessage; @@ -50,7 +51,7 @@ void modeBoiteAuxLettres(struct sockaddr_in socketStruct, int socketType, int po n=-1; break; case MODE_EMIS: - receptionEmetteur(sock,tailleMessage,&n,1,emetteurRecepteur,&boiteAuxLettres); + receptionEmetteur(sock,tailleMessage,&n,getEmetteurId(socketStruct,tabledIP),emetteurRecepteur,&boiteAuxLettres); break; default: printf("Message non reconnu.\n"); @@ -60,7 +61,10 @@ void modeBoiteAuxLettres(struct sockaddr_in socketStruct, int socketType, int po /*Si on est en mode emis, le serveur affiche les données rentrées dans la boite aux lettres*/ if(param == MODE_EMIS) { + printf("---Boîte aux Lettres actuel :---\n"); afficheListeBAL(boiteAuxLettres); + printf("---Liste d'IP actuel :---\n"); + afficheListeIpTable(*tabledIP); } /*On ferme le socket qu'il provienne du MODE_RECEPTEUR ou MODE_EMIS*/ close(sock); @@ -96,7 +100,7 @@ int receptionRecepteur(int sock, int socketType, struct sockaddr_in socketStruct Le message avec la taille correcte. On incrémente i pour l'affichage et on passe à l'élément suivant.*/ while(elementCourant->suiv != elementFinal->suiv) { - paramMessage = formatTextParam(MODE_RECEPTEUR,recepteur,elementCourant->messageBALActuel->tailleData,getMessages(boiteAuxLettres,recepteur)->nbMessages); + paramMessage = formatTextParam(MODE_RECEPTEUR,elementCourant->messageBALActuel->idEmetteur,elementCourant->messageBALActuel->tailleData,getMessages(boiteAuxLettres,recepteur)->nbMessages); longueurEmis = write(sock,paramMessage,13); printAndVerif(paramMessage,13,longueurEmis,i); @@ -167,4 +171,24 @@ int readRecvFrom(int sock, struct sockaddr_in socketStruct, int longueurRecu, ch messageRecu[n] = '\0'; printf("Puit\tReception n°%d (%d) :\t[%s]\n",i,n,messageRecu); return n; +} + +int getEmetteurId(struct sockaddr_in socketStruct, struct listeIpTable * tabledIp) +{ + bool isInTable; + char StripAddressStruct[INET_ADDRSTRLEN]; + struct in_addr ipAddressStruct = ((struct sockaddr_in*)&socketStruct)->sin_addr; + inet_ntop( AF_INET, &ipAddressStruct, StripAddressStruct, INET_ADDRSTRLEN ); + struct elementIpTable * returnEmetteurId = existInListIP(*tabledIp,StripAddressStruct,&isInTable); + if(isInTable) + { + printf("[trouve] : idEmetteur = %d",returnEmetteurId->actualIpTable->idEmetteur); + return returnEmetteurId->actualIpTable->idEmetteur; + } + else + { + printf("[non trouve] : idEmetteur = %d",tabledIp->taille+1); + ajoutListeIpTable(tabledIp,creeIpTable(StripAddressStruct,tabledIp->taille+1)); + return tabledIp->taille; + } } \ No newline at end of file diff --git a/src/source.c b/src/source.c index fcc5674..6ef8636 100644 --- a/src/source.c +++ b/src/source.c @@ -95,6 +95,7 @@ void modeRecepteur(int recepteur,int sock,struct sockaddr_in * socketStruct,int recuperationParam(paramRecu,¶m,&emetteurRecepteur,&tailleMessage,&nbMessage); char * messageRecu = malloc(sizeof(char)*tailleMessage); longueurEmis = read(sock,messageRecu,tailleMessage); + printf("Emetteur : %d\t",emetteurRecepteur); printAndVerif(messageRecu,tailleMessage,longueurEmis,i); i++; }