Files de messages avec des threads
Bonjour,
J'essaie de réaliser l'utilisation d'une file de messages en reprenant pour que ce soit plus simple d'abord le modèle client-serveur où le client envoie 2 nombres à additionner au serveur. J'essaie de faire en sorte qu'il y a plusieurs clients et 1 serveur.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| void *ProcedureClient (void *arg) {
int num = (int) arg;
int ms_id;
int n1,n2;
int reponse;
int numClient;
struct reponse Ma_reponse;
struct requete Ma_requete;
/*On récupère le pid*/
numClient = num;
/*Le client accède à la file de messages*/
/*Il veut notamment récupérer le numéro d'identifiant*/
ms_id = msgget(CLE, 0750);
/*On récupère ensuite les deux entiers à additionner*/
printf("[Client %d] : Entrez deux entiers s'il vous plait \n", numClient);
scanf("%d %d", &n1, &n2);
/*On initialise la structure "requete"*/
Ma_requete.type = 1;
Ma_requete.nb1 = n1;
Ma_requete.nb2 = n2;
Ma_requete.mon_num = numClient;
/*Il reste enfin à envoyer cette structure sur la file de messages (pas d'option particulière)*/
/* int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); */
CHECK(msgsnd(ms_id, &Ma_requete, sizeof(struct requete)-4, 0), "Echec envoi message sur la file !");
/*On récupère ensuite le message de réponse envoyé par le serveur*/
usleep(2000000);
CHECK(msgrcv(ms_id, &Ma_reponse, sizeof(struct reponse)-4, numClient, 0), "Pb recuperation reponse :");
/*On récupère les différents arguments*/
reponse = Ma_reponse.rep;
// On verifie que c'est bien l'addition de nos 2 nombres
if (reponse==(n1+n2)) {
printf("Reponse correcte : la somme de %d et %d est bien %d\n", n1, n2, reponse);
exit(0);
}
else {
printf("Erreur de calcul !!\n");
}
pthread_exit(NULL);
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| void *ProcedureServeur (void *arg) {
int ms_id;
int n1,n2, ntotal;
int reponse;
int numClient;
struct reponse Ma_reponse;
struct requete Ma_requete;
/*Le serveur crée la file de messages*/
CHECK((ms_id = msgget(CLE, IPC_CREAT|0750)), "Pb creation file");
while(1) {
/*On vérifie que tout s'est bien déroulé*/
CHECK(msgrcv(ms_id,&Ma_requete,sizeof(struct requete)-4,1,0), "Pb récupération message:");
/*On récupère ensuite les différents champs*/
n1 = Ma_requete.nb1;
n2 = Ma_requete.nb2;
printf("[Serveur] : Nombres %d et %d\n",n1,n2);
numClient = Ma_requete.mon_num;
/*On additionne le résultat*/
ntotal = n1 + n2;
printf("Le total est %d\n", ntotal);
/*On met le contenu du résultat dans la structure "reponse"*/
Ma_reponse.type = numClient;
Ma_reponse.rep = ntotal;
/*Envoi du message sur la file */
CHECK(msgsnd(ms_id, &Ma_reponse, sizeof(struct reponse)-4, 0), "Pb envoi message retour");
}
pthread_exit(NULL);
} |
Et le main :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| int main (int argc, char ** argv)
{
int ms_id;
int n1,n2;
int reponse;
int numClient;
struct reponse Ma_reponse;
struct requete Ma_requete;
signal(SIGINT, traitementFinProgramme);
pthread_t thread_client;
pthread_t thread_serveur;
pthread_create(&thread_serveur, NULL, ProcedureServeur, NULL);
for (int i = 0 ; i < 3 ; i++) {
pthread_create(&thread_client, NULL, ProcedureClient, i+1);
}
pthread_join(thread_serveur, 0);
for (int i = 0 ; i < 3 ; i++) {
pthread_join(thread_client, 0);
}
} |
Concernant les struct :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| struct requete
{
long type; /*Permet de définir à qui s'adresse la requete*/
int nb1;
int nb2;
int mon_num; /*Permet de définir l'id de l'utilisateur*/
};
struct reponse
{
long type;
int rep;
}; |
Et le fameux CHECK :
Code:
#define CHECK(sts,msg) if ((sts) == -1) { perror(msg); exit(sts); }
Pour le compiler j'ai utilisé : gcc NOM_FICHIER.c -o nom -Wall -lpthread -std=c99
Si il faut utiliser des mutex, je préfère introduire les pthread_mutex_lock, pthread_cond_wait...
Merci de votre aide :)