Ajout de commentaires pour tsock.h. Changement de noms de fonctions. Bug recuperationParam corrigé.

This commit is contained in:
Yohan Boujon 2023-01-22 20:14:04 +01:00
parent 9c85606371
commit ce09883320
6 changed files with 180 additions and 49 deletions

View file

@ -53,6 +53,7 @@ void afficheListeBAL(struct listeBAL listeActuel);
struct elementBAL * existInListBAL(struct listeBAL listeActuel, int idRecepteur, bool * boolRetour); struct elementBAL * existInListBAL(struct listeBAL listeActuel, int idRecepteur, bool * boolRetour);
void nouveauMessage(struct listeBAL * b,int idEmetteur,int idRecepteur,char *data); void nouveauMessage(struct listeBAL * b,int idEmetteur,int idRecepteur,char *data);
/** /**
* @brief Récupère la liste de message d'un recepteur précis * @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, * Attention de vérifier si la liste est vide -> si c'est le cas,
@ -63,6 +64,8 @@ void nouveauMessage(struct listeBAL * b,int idEmetteur,int idRecepteur,char *dat
* @return struct listeMessage* * @return struct listeMessage*
*/ */
struct listeMessage * getMessages(struct listeBAL b, int idRecepteur); struct listeMessage * getMessages(struct listeBAL b, int idRecepteur);
void formatListMessage(struct listeMessage l); void formatListMessage(struct listeMessage l);
#endif #endif

View file

@ -14,19 +14,155 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include <stdbool.h> #include <stdbool.h>
#define NBMESSAGE_DEFAULT 10
#define MAX_MESSAGE 4
#define MODE_PARAMETRE 0
#define MODE_RECEPTEUR 1
#define MODE_EMIS 2
/**
* @brief Permet de gérer le nombre de message envoyés s'ils ne sont pas précisés
* par l'utilisateur (uniquement en mode source).
* Ici le nombre par défaut est définie par NBMESSAGE_DEFAULT.
* A noter que pour le puit, ce nombre est laissé à -1 car le nombre de message recu
* est infini.
* @author Yohan Boujon
*
* @param nb int *, pointeur sur l'entier à modifier
* @param source source, vérifie si nous sommes bien en mode source
*/
void setNbMessage(int * nb, int source); void setNbMessage(int * nb, int source);
/**
* @brief Affiche les informations principales rentrées par l'utilisateur, notamment : le mode, le nombre de messages,
* la taille des messages, le port, l'adresse IP, le mode (TCP/UDP).
* @author Yohan Boujon
*
* @param source int, source ou puit
* @param isTCP int, TCP ou UDP
* @param nbMessage int, le nombre de message à envoyer/à recevoir (-1 en reception est lu comme infini)
* @param taille int, la taille de chaque message
* @param portNumber int, numéro du port
* @param ipAddress char*, l'adresse IP sous chaîne de caractère
*/
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[]);
/**
* @brief Initialise la structure du socket pour avoir le port et l'ip. Si le mode choisi est reception : l'ip est ignorée.
* Utilise la fonction gethostbyname pour récupérer l'IPv4 à partir d'une chaîne de caractère quelconque.
* @author Yohan Boujon
*
* @param socketTempStruct struct sockaddr_in*, pointeur sur la structure (doit être initialisée au préalable).
* @param source int, source ou puit -> si à 0 alors ipAddress sera ignoré et défini par INADDR_ANY.
* @param port int, le port du socket.
* @param ipAddress char *, l'Adresse IP du socket.
*/
void initStructSocket(struct sockaddr_in *socketTempStruct, int source, int port, char * ipAddress); void initStructSocket(struct sockaddr_in *socketTempStruct, int source, int port, char * ipAddress);
/**
* @brief Récupère toutes les informations qui n'utilisent pas getopt,
* notamment le port ainsi que l'ip.
* @author Yohan Boujon
*
* @param argv char **, liste de chaîne de caractère des arguments
* @param argc int, nombre d'arguments (IP -> argc-1 et Port -> argc-2)
* @param portNumber int *, numéro du port retourné
* @param ipAddress char **, pointeur faire une chaîne de caractère de l'adresse ip retournée
*/
void getNonOtpArgs(char ** argv, int argc, int * portNumber, char * ipAddress[]); void getNonOtpArgs(char ** argv, int argc, int * portNumber, char * ipAddress[]);
/**
* @brief [utile pour source.c] à partir d'un numéro, d'un message et d'une taille
* Créer une trame avec 5 caractères pour le numéro du message, et le reste pour le message
* @author Yohan Boujon
*
* @param actualMessage char *, Doit être initialisé. Message modifié.
* @param num int, numéro du message, ne doit pas dépasser 9999.
* @param tailleMessage int, taille du message final.
* @param messageChar char, caractère du message, sera répété pour 4-tailleMessage fois.
*/
void formatText(char * actualMessage, int num, int tailleMessage, char messageChar); void formatText(char * actualMessage, int num, int tailleMessage, char messageChar);
/**
* @brief Permet, pour une taille max donnée. De quitter le programme si cette valeur est dépassée.
* @author Simon Paris
*
* @param var int, variable à tester.
* @param tailleMax int, le test.
* @return int retourne 0 si cela s'est bien executé.
*/
int exitMax(int var,int tailleMax); int exitMax(int var,int tailleMax);
/**
* @brief Converti plusieurs paramètres en une chaîne de caractère. Couche protocolaire de l'application.
* Sous la forme suivante : [messageType[1],numEmetteur[4],numRecepteur[4],tailleMessage[4],nbMessage[4]]
* @author Simon Paris
*
* @param modeParam int, MODE_PARAMETRE pour un paramètre pure, MODE_RECEPTEUR -> -r ##, MODE_EMIS -> -e ##.
* @param numEmetteur int, numéro de l'émetteur (-e ##, ou idEmetteur).
* @param numRecepteur int, numéro du recepteur (-r ##, ou idRecepteur).
* @param tailleMessage int, taille du message à envoyer.
* @param nbMessage int, nombre de message à envoyer [inutilisé].
* @return char* chaîne de caractère à envoyer via TCP.
*/
char * formatTextParam(int modeParam, int numEmetteur, int numRecepteur, int tailleMessage, int nbMessage); char * formatTextParam(int modeParam, int numEmetteur, int numRecepteur, int tailleMessage, int nbMessage);
/**
* @brief Ajoute un numéro au début du message à envoyer.
* @author Simon Paris
*
* @param message char *, chaîne de caractère du message originel.
* @param tailleMessage int, taille du message "message".
* @return char* renvoi la chaîne modifiée.
*/
char * formatTextMessage(char * message, int tailleMessage); char * formatTextMessage(char * message, int tailleMessage);
int convertion(int nbr,char *numbuffer);
/**
* @brief Converti un nombre en chaîne de caractre et le place dans la chaîne actualMessage.
* La taille de ce dernier doit être connu au préalable
* @author Simon Paris
*
* @param actualMessage char *, message à modifier.
* @param encadrementHaut int, offset du début du nombre.
* @param encadrementBas int, offset de la fin du nombre.
* @param nbr int, nombre à convertir en chaîne de caractère, ne doit pas dépasser 9999.
* @return int retourne encadrementHaut.
*/
int gestionOffset(char *actualMessage,int encadrementHaut,int encadrementBas,int nbr); int gestionOffset(char *actualMessage,int encadrementHaut,int encadrementBas,int nbr);
/**
* @brief Teste les différentes fonctions permettant de gérer le protocole,
* autant en lecture qu'écriture
* @author Simon Paris
*
* @return int 0 si réussi
*/
int testProtocol(void); int testProtocol(void);
/**
* @brief Récupération de chaque paramètres grâce à la trame précédente.
* @author Simon Paris
*
* @param msgParam char *, chaîne reçue avant le message, couche protocolaire.
* @param messageOrPram int *, renvoi MODE_PARAM,MODE_SOURCE ou MODE_EMIS.
* @param numEmetteurParam int *, renvoi le numéro de l'émetteur.
* @param numRecepeteurParam int *, renvoi le numéro du recepteur.
* @param numTailleMessageParam int *, renvoi la taille du message émis.
* @param nbMessageParam int *, renvoi le nombre de message a recevoir [Inutilisé]
* @return int
*/
int recuperationParam(char * msgParam, int * messageOrPram, int * numEmetteurParam, int * numRecepeteurParam, int * numTailleMessageParam, int * nbMessageParam); int recuperationParam(char * msgParam, int * messageOrPram, int * numEmetteurParam, int * numRecepeteurParam, int * numTailleMessageParam, int * nbMessageParam);
int int2String(char *msgParam, int offset);
/**
* @brief converti une chaîne de caractère spécifique (protocolaire) en entiers avec une gestion d'offset.
* La taille lue entre chaque offset est définie par MAX_MESSAGE.
* @author Simon Paris
* @author Yohan Boujon
*
* @param data char *, la chaîne de caractère à lire.
* @param offset int, offset : décalage de n caractère sur la chaîne data.
* @return int nombre récupéré entre 0 et 9999.
*/
int protocol2int(char * data, int offset);
#endif #endif

View file

@ -20,7 +20,6 @@ int bal(void){
messageBAL * creeMessage(char *data,int idEmetteur) messageBAL * creeMessage(char *data,int idEmetteur)
{ {
messageBAL * message = malloc(sizeof(messageBAL)); messageBAL * message = malloc(sizeof(messageBAL));
message->idEmetteur=idEmetteur; 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);

View file

@ -6,7 +6,7 @@
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"; char usageChar[100]="usage: cmd [-p|-s]|[-u][-u|-r ##|-e ##|-b][-n ##][-l ##] port ipAdress\n";
testProtocol(); //testProtocol();
//bal(); //bal();
char *ipAddress; char *ipAddress;
extern char *optarg; extern char *optarg;
@ -93,12 +93,10 @@ int main (int argc, char **argv)
if(source) if(source)
{ {
//printf("Source : %d\n",nb_message);
launchSource(nb_message,tailleMessage,tcp,port,ipAddress,emetteur,recepteur); launchSource(nb_message,tailleMessage,tcp,port,ipAddress,emetteur,recepteur);
} }
else else
{ {
//printf("Puit : %d\n",nb_message);
launchPuit(nb_message,tailleMessage,tcp,port,ipAddress,isBAL); launchPuit(nb_message,tailleMessage,tcp,port,ipAddress,isBAL);
} }
return(EXIT_SUCCESS); return(EXIT_SUCCESS);

View file

@ -53,10 +53,10 @@ int modeBoiteAuxLettres(struct sockaddr_in socketStruct, int socketType, int por
recuperationParam(paramRecu,&param,&emetteur,&recepteur,&tailleMessage,&nbMessage); recuperationParam(paramRecu,&param,&emetteur,&recepteur,&tailleMessage,&nbMessage);
switch(param) switch(param)
{ {
case 1: case MODE_RECEPTEUR:
printf("Renvoi de la boite aux lettres en mode recepteur."); printf("Renvoi de la boite aux lettres en mode recepteur.");
break; break;
case 2: case MODE_EMIS:
printf("Reception de messages en mode emission."); printf("Reception de messages en mode emission.");
receptionEmetteur(sock,tailleMessage,&n,emetteur,recepteur,&boiteAuxLettres); receptionEmetteur(sock,tailleMessage,&n,emetteur,recepteur,&boiteAuxLettres);
break; break;

View file

@ -1,10 +1,21 @@
#include "../header/tsock.h" #include "../header/tsock.h"
int testProtocol(void)
{
char * msg,*msg2;
msg=formatTextParam(0,7, 8, 64, 1);
printf("%s\n",msg);
msg2=formatTextMessage("aaaaaa",6);
printf("%s\n",msg2);
//recuperationParam(msg);
return 0;
}
void setNbMessage(int * nb, int source) void setNbMessage(int * nb, int source)
{ {
if((*nb == -1) && (source)) if((*nb == -1) && (source))
{ {
*nb = 10; *nb = NBMESSAGE_DEFAULT;
} }
} }
@ -74,44 +85,13 @@ void formatText(char * actualMessage, int num, int tailleMessage, char messageCh
} }
int exitMax(int var,int tailleMax){ int exitMax(int var,int tailleMax){
if(var>1500){ if(var>tailleMax){
printf("-l doit être <1500 \n"); printf("-l doit être <1500 \n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
return 0; return 0;
} }
int testProtocol(void)
{
char * msg,*msg2;
msg=formatTextParam(0,7, 8, 64, 1);
printf("%s\n",msg);
msg2=formatTextMessage("aaaaaa",6);
printf("%s\n",msg2);
//recuperationParam(msg);
return 0;
}
int recuperationParam(char * msgParam, int * messageOrPram, int * numEmetteurParam, int * numRecepeteurParam, int * numTailleMessageParam, int * nbMessageParam)
{
*messageOrPram=msgParam[0]-0x30;
*numEmetteurParam = int2String(msgParam,1);
*numRecepeteurParam= int2String(msgParam,5);
*numTailleMessageParam= int2String(msgParam,9);
*nbMessageParam=int2String(msgParam,13);
return 0;
}
int int2String(char *msgParam, int offset)
{
int taille =4;
char buffEntier[taille];
for(int i=offset,j=0;i<=offset+taille;i++,j++){
buffEntier[j]=msgParam[i];
}
return atoi(buffEntier);
}
char * formatTextParam(int modeParam, int numEmetteur, int numRecepteur, int tailleMessage, int nbMessage) char * formatTextParam(int modeParam, int numEmetteur, int numRecepteur, int tailleMessage, int nbMessage)
{ {
char * actualMessage = malloc(sizeof(char)*16); char * actualMessage = malloc(sizeof(char)*16);
@ -134,17 +114,11 @@ char * formatTextMessage(char * message, int tailleMessage)
return actualMessage; return actualMessage;
} }
int convertion(int nbr,char *numbuffer)
{
sprintf(numbuffer, "%d", (nbr)%10000);
return 0;
}
int gestionOffset(char *actualMessage,int encadrementHaut,int encadrementBas,int nbr) int gestionOffset(char *actualMessage,int encadrementHaut,int encadrementBas,int nbr)
{ {
int taillechaine=0; int taillechaine=0;
char numbuffer[30]; char numbuffer[30];
convertion(nbr,numbuffer); sprintf(numbuffer, "%d", (nbr)%10000);
taillechaine=strlen(numbuffer); taillechaine=strlen(numbuffer);
for(int i=encadrementBas;i<encadrementHaut-taillechaine+1;i++) for(int i=encadrementBas;i<encadrementHaut-taillechaine+1;i++)
{ {
@ -156,5 +130,26 @@ int gestionOffset(char *actualMessage,int encadrementHaut,int encadrementBas,int
actualMessage[i]=numbuffer[j]; actualMessage[i]=numbuffer[j];
} }
return encadrementHaut; return encadrementHaut;
}
int recuperationParam(char * msgParam, int * messageOrPram, int * numEmetteurParam, int * numRecepeteurParam, int * numTailleMessageParam, int * nbMessageParam)
{
*messageOrPram=msgParam[0]-0x30;
*numEmetteurParam =protocol2int(msgParam,1);
*numRecepeteurParam=protocol2int(msgParam,MAX_MESSAGE+1);
*numTailleMessageParam=protocol2int(msgParam,(2*MAX_MESSAGE)+1);
*nbMessageParam=protocol2int(msgParam,(3*MAX_MESSAGE)+1);
return 0;
}
int protocol2int(char * data, int offset)
{
char buff[MAX_MESSAGE+1];
for(int i=offset,j=0;i<MAX_MESSAGE+offset;i++,j++)
{
buff[j]=data[i];
}
buff[MAX_MESSAGE+1]='\0';
return atoi(buff)%10000;
} }