mirror of
https://github.com/yoboujon/tsock.git
synced 2025-06-08 14:00:50 +02:00
Gestion Emetteur et Recepteur completement fonctionnel. A chaque nouvelle Adresse IP, un numéro emetteur lui sera associé.
This commit is contained in:
parent
44ae8aedea
commit
eee3ca5c81
6 changed files with 219 additions and 3 deletions
112
header/iptable.h
Normal file
112
header/iptable.h
Normal 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
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "tsock.h"
|
#include "tsock.h"
|
||||||
#include "bal.h"
|
#include "bal.h"
|
||||||
|
#include "iptable.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Fonction principale pour le puit. Peut lancer en mode TCP/UDP avec la fonction receiveMultipleData()
|
* @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 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
|
#endif
|
|
@ -61,7 +61,7 @@ void afficheListeMessage(struct listeMessage listeActuel)
|
||||||
struct elementMessage * elementCourant = listeActuel.courant;
|
struct elementMessage * elementCourant = listeActuel.courant;
|
||||||
while(elementCourant->suiv != elementFinal->suiv)
|
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;
|
elementCourant=elementCourant->suiv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
76
src/iptable.c
Normal file
76
src/iptable.c
Normal 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;
|
||||||
|
}
|
28
src/puit.c
28
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.
|
Intiialisation de la taille de socketStruct pour les différentes fonctions.
|
||||||
Création des 4 variables à récupérer dans la couche protocolaire.*/
|
Création des 4 variables à récupérer dans la couche protocolaire.*/
|
||||||
struct listeBAL boiteAuxLettres = initListeBAL();
|
struct listeBAL boiteAuxLettres = initListeBAL();
|
||||||
|
struct listeIpTable * tabledIP = initListeIpTable();
|
||||||
char paramRecu[13];
|
char paramRecu[13];
|
||||||
int n, longueurRecu = sizeof(socketStruct),sock,oldSock;
|
int n, longueurRecu = sizeof(socketStruct),sock,oldSock;
|
||||||
int param,emetteurRecepteur,tailleMessage,nbMessage;
|
int param,emetteurRecepteur,tailleMessage,nbMessage;
|
||||||
|
@ -50,7 +51,7 @@ void modeBoiteAuxLettres(struct sockaddr_in socketStruct, int socketType, int po
|
||||||
n=-1;
|
n=-1;
|
||||||
break;
|
break;
|
||||||
case MODE_EMIS:
|
case MODE_EMIS:
|
||||||
receptionEmetteur(sock,tailleMessage,&n,1,emetteurRecepteur,&boiteAuxLettres);
|
receptionEmetteur(sock,tailleMessage,&n,getEmetteurId(socketStruct,tabledIP),emetteurRecepteur,&boiteAuxLettres);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("Message non reconnu.\n");
|
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*/
|
/*Si on est en mode emis, le serveur affiche les données rentrées dans la boite aux lettres*/
|
||||||
if(param == MODE_EMIS)
|
if(param == MODE_EMIS)
|
||||||
{
|
{
|
||||||
|
printf("---Boîte aux Lettres actuel :---\n");
|
||||||
afficheListeBAL(boiteAuxLettres);
|
afficheListeBAL(boiteAuxLettres);
|
||||||
|
printf("---Liste d'IP actuel :---\n");
|
||||||
|
afficheListeIpTable(*tabledIP);
|
||||||
}
|
}
|
||||||
/*On ferme le socket qu'il provienne du MODE_RECEPTEUR ou MODE_EMIS*/
|
/*On ferme le socket qu'il provienne du MODE_RECEPTEUR ou MODE_EMIS*/
|
||||||
close(sock);
|
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.*/
|
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)
|
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);
|
longueurEmis = write(sock,paramMessage,13);
|
||||||
printAndVerif(paramMessage,13,longueurEmis,i);
|
printAndVerif(paramMessage,13,longueurEmis,i);
|
||||||
|
|
||||||
|
@ -168,3 +172,23 @@ int readRecvFrom(int sock, struct sockaddr_in socketStruct, int longueurRecu, ch
|
||||||
printf("Puit\tReception n°%d (%d) :\t[%s]\n",i,n,messageRecu);
|
printf("Puit\tReception n°%d (%d) :\t[%s]\n",i,n,messageRecu);
|
||||||
return n;
|
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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -95,6 +95,7 @@ void modeRecepteur(int recepteur,int sock,struct sockaddr_in * socketStruct,int
|
||||||
recuperationParam(paramRecu,¶m,&emetteurRecepteur,&tailleMessage,&nbMessage);
|
recuperationParam(paramRecu,¶m,&emetteurRecepteur,&tailleMessage,&nbMessage);
|
||||||
char * messageRecu = malloc(sizeof(char)*tailleMessage);
|
char * messageRecu = malloc(sizeof(char)*tailleMessage);
|
||||||
longueurEmis = read(sock,messageRecu,tailleMessage);
|
longueurEmis = read(sock,messageRecu,tailleMessage);
|
||||||
|
printf("Emetteur : %d\t",emetteurRecepteur);
|
||||||
printAndVerif(messageRecu,tailleMessage,longueurEmis,i);
|
printAndVerif(messageRecu,tailleMessage,longueurEmis,i);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue