mirror of
https://github.com/yoboujon/tsock.git
synced 2025-06-08 22:10:50 +02:00
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:
commit
6dd257b350
6 changed files with 239 additions and 32 deletions
46
header/bal.h
46
header/bal.h
|
@ -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
|
|
@ -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
|
|
@ -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
152
src/bal.c
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
44
src/main.c
44
src/main.c
|
@ -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);
|
||||||
}
|
}
|
25
src/puit.c
25
src/puit.c
|
@ -1,25 +1,36 @@
|
||||||
#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(isBAL)
|
||||||
|
{
|
||||||
|
printf("Mode Boîte aux Lettres\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
receiveMultipleData(nombreMessage,tailleMessage,sock,socketPuit,isTCP);
|
||||||
|
close(sock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if((sock=socket(AF_INET,socketType,0)) == -1)
|
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");
|
perror("[tsock] : fonction socket() : echec creation du socket\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
initStructSocket(&socketPuit,0,port,ipAddress);
|
initStructSocket(socketStruct,0,port,ipAddress);
|
||||||
if (bind(sock, (struct sockaddr *)&socketPuit, sizeof(socketPuit)) < 0 )
|
if (bind(sockReturn, (struct sockaddr *)socketStruct, sizeof(*socketStruct)) < 0 )
|
||||||
{
|
{
|
||||||
perror("[tsock] : fonction bind() : echec du lien avec socket serveur.\n");
|
perror("[tsock] : fonction bind() : echec du lien avec socket serveur.\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
receiveMultipleData(nombreMessage,tailleMessage,sock,socketPuit,isTCP);
|
return sockReturn;
|
||||||
close(sock);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue