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);
}
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);
}
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
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 : 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;
};
Et le fameux CHECK :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
#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