Merge pull request #10 from yoboujon/yohan

Modification du main avec de nouveaux arguments. bal.c fonctionnel et ajout du mode boîte aux lettres
This commit is contained in:
sparis1206 2023-01-18 09:02:57 +01:00 committed by GitHub
commit 6dd257b350
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 239 additions and 32 deletions

View file

@ -3,10 +3,12 @@
#include "tsock.h" #include "tsock.h"
int bal(void);
typedef struct{ typedef struct{
char *data; char *data;
int tailleData; int tailleData;
int idEmeteur; int idEmetteur;
}messageBAL; }messageBAL;
struct elementMessage{ struct elementMessage{
@ -20,11 +22,47 @@ struct listeMessage{
struct elementMessage * fin; 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 elementMessage * initElementMessage(void);
struct listeMessage initListeMessage(void); struct listeMessage * initListeMessage(void);
void ajoutListe(struct listeMessage * listeActuel,messageBAL * leMessage); void ajoutListeMessage(struct listeMessage * listeActuel,messageBAL * leMessage);
void afficheListeMessage(struct listeMessage listeActuel); void afficheListeMessage(struct listeMessage listeActuel);
int bal(void); 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 #endif

View file

@ -3,7 +3,8 @@
#include "tsock.h" #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); int receiveMultipleData(int nombreMessages, int tailleMessage, int sock, struct sockaddr_in socketStruct, int isTCP);
#endif #endif

View file

@ -12,6 +12,7 @@
#include <netdb.h> #include <netdb.h>
#include <errno.h> #include <errno.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <stdbool.h>
void setNbMessage(int * nb, int source); void setNbMessage(int * nb, int source);
void printInfo(int source, int isTCP, int nbMessage, int taille, int portNumber, char ipAddress[]); void printInfo(int source, int isTCP, int nbMessage, int taille, int portNumber, char ipAddress[]);

152
src/bal.c
View file

@ -1,18 +1,27 @@
#include "../header/bal.h" #include "../header/bal.h"
int bal(void){ int bal(void){
struct listeMessage l = initListeMessage(); struct listeBAL boiteAuxLettres = initListeBAL();
messageBAL * messageBAL = creeMessage("Renvoi moi mon pdf asap. -Simon",1); nouveauMessage(&boiteAuxLettres,2,1,"Renvoi moi mon pdf asap. -Simon");
ajoutListe(&l,messageBAL); nouveauMessage(&boiteAuxLettres,2,1,"Mon anniversaire c'est demain !");
afficheListeMessage(l); 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; return 0;
} }
messageBAL * creeMessage(char *data,int idEmeteur) messageBAL * creeMessage(char *data,int idEmetteur)
{ {
messageBAL * message = malloc(sizeof(messageBAL)); messageBAL * message = malloc(sizeof(messageBAL));
message->idEmeteur=idEmeteur; message->idEmetteur=idEmetteur;
message->tailleData=strlen(data); message->tailleData=strlen(data);
message->data=(char*)malloc(sizeof(char)*message->tailleData); message->data=(char*)malloc(sizeof(char)*message->tailleData);
strcpy(message->data,data); strcpy(message->data,data);
@ -27,16 +36,16 @@ struct elementMessage * initElementMessage(void)
return returnElement; return returnElement;
} }
struct listeMessage initListeMessage(void) struct listeMessage * initListeMessage(void)
{ {
struct listeMessage l; struct listeMessage * l=malloc(sizeof(struct listeMessage));
l.debut=initElementMessage(); l->debut=initElementMessage();
l.fin=initElementMessage(); l->fin=initElementMessage();
l.courant=initElementMessage(); l->courant=initElementMessage();
return l; return l;
} }
void ajoutListe(struct listeMessage * listeActuel,messageBAL * leMessage) void ajoutListeMessage(struct listeMessage * listeActuel,messageBAL * leMessage)
{ {
struct elementMessage * elementActuel = malloc(sizeof(struct elementMessage)); struct elementMessage * elementActuel = malloc(sizeof(struct elementMessage));
elementActuel->messageBALActuel=leMessage; elementActuel->messageBALActuel=leMessage;
@ -55,3 +64,122 @@ void afficheListeMessage(struct listeMessage listeActuel)
elementCourant=elementCourant->suiv; 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;i<tailleNum;i++)
{
messageSend[i]=numBuff[i];
}
for(int i=tailleNum,j=0;i<tailleNum+elementCourant->messageBALActuel->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;
}
}

View file

@ -4,25 +4,25 @@
int main (int argc, char **argv) int main (int argc, char **argv)
{ {
char usageChar[100]="usage: cmd [-p|-s]|[-u][-u|-r ##|-e ##|-b][-n ##][-l ##] port ipAdress\n";
testProtocol(); testProtocol();
char usageChar[30]="usage: cmd [-p|-s][-n ##]\n";
char *ipAddress; char *ipAddress;
extern char *optarg; extern char *optarg;
extern int optind; 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 */ 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:")) != -1) { while ((c = getopt(argc, argv, "pn:sul:e:r:b")) != -1) {
switch (c) { switch (c) {
case 'p': case 'p':
if (source != -1) { if (source != -1) {
printf("%s",usageChar); printf("%s",usageChar);
exit(1); exit(EXIT_FAILURE);
} }
source = 0; source = 0;
break; break;
case 's': case 's':
if (source != -1) { if (source != -1) {
printf("%s",usageChar); printf("%s",usageChar);
exit(1) ; exit(EXIT_FAILURE);
} }
source = 1; source = 1;
break; break;
@ -36,21 +36,49 @@ int main (int argc, char **argv)
case 'u': case 'u':
tcp=0; tcp=0;
break; 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: default:
printf("%s",usageChar); printf("%s",usageChar);
exit(EXIT_FAILURE);
break; break;
} }
} }
if (source == -1) { if (source == -1) {
printf("-p|-s non present !\n"); printf("-p|-s non present !\n");
printf("%s",usageChar); printf("%s",usageChar);
exit(1); exit(EXIT_FAILURE);
} }
if(argc != optind+2) if(argc != optind+2)
{ {
printf("ip ou port non present !\n"); printf("ip ou port non present !\n");
printf("%s",usageChar); printf("%s",usageChar);
exit(1); exit(EXIT_FAILURE);
} }
if(tailleMessage == -1) if(tailleMessage == -1)
@ -69,7 +97,7 @@ int main (int argc, char **argv)
else else
{ {
//printf("Puit : %d\n",nb_message); //printf("Puit : %d\n",nb_message);
launchPuit(nb_message,tailleMessage,tcp,port,ipAddress); launchPuit(nb_message,tailleMessage,tcp,port,ipAddress,isBAL);
} }
return(EXIT_SUCCESS); return(EXIT_SUCCESS);
} }

View file

@ -1,27 +1,38 @@
#include "../header/puit.h" #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; int sock,socketType;
struct sockaddr_in socketPuit; struct sockaddr_in socketPuit;
socketType = (isTCP) ? SOCK_STREAM : SOCK_DGRAM; socketType = (isTCP) ? SOCK_STREAM : SOCK_DGRAM;
sock = initSocket(socketType,&socketPuit,port,ipAddress);
if((sock=socket(AF_INET,socketType,0)) == -1) if(isBAL)
{ {
perror("[tsock] : fonction socket() : echec creation du socket\n"); printf("Mode Boîte aux Lettres\n");
exit(EXIT_FAILURE); return 0;
}
initStructSocket(&socketPuit,0,port,ipAddress);
if (bind(sock, (struct sockaddr *)&socketPuit, sizeof(socketPuit)) < 0 )
{
perror("[tsock] : fonction bind() : echec du lien avec socket serveur.\n");
exit(EXIT_FAILURE);
} }
receiveMultipleData(nombreMessage,tailleMessage,sock,socketPuit,isTCP); receiveMultipleData(nombreMessage,tailleMessage,sock,socketPuit,isTCP);
close(sock); close(sock);
return 0; return 0;
} }
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(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);
}
return sockReturn;
}
int receiveMultipleData(int nombreMessages, int tailleMessage, int sock, struct sockaddr_in socketStruct, int isTCP) int receiveMultipleData(int nombreMessages, int tailleMessage, int sock, struct sockaddr_in socketStruct, int isTCP)
{ {
char messageRecu[tailleMessage+1]; char messageRecu[tailleMessage+1];