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 : Sélectionner tout - Visualiser dans une fenêtre à part
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); }Et le main :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
Concernant les struct :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } }
Et le fameux CHECK :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; };Pour le compiler j'ai utilisé : gcc NOM_FICHIER.c -o nom -Wall -lpthread -std=c99
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define CHECK(sts,msg) if ((sts) == -1) { perror(msg); exit(sts); }
Si il faut utiliser des mutex, je préfère introduire les pthread_mutex_lock, pthread_cond_wait...
Merci de votre aide
Partager