Gestion Emetteur et Recepteur completement fonctionnel. A chaque nouvelle Adresse IP, un numéro emetteur lui sera associé.

This commit is contained in:
Yohan Boujon 2023-01-25 12:23:16 +01:00
parent 44ae8aedea
commit eee3ca5c81
6 changed files with 219 additions and 3 deletions

112
header/iptable.h Normal file
View file

@ -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

View file

@ -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

View file

@ -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;
}
}

76
src/iptable.c Normal file
View file

@ -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;
}

View file

@ -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;
}
}

View file

@ -95,6 +95,7 @@ void modeRecepteur(int recepteur,int sock,struct sockaddr_in * socketStruct,int
recuperationParam(paramRecu,&param,&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++;
}