IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Files de messages avec des threads


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 30
    Points : 21
    Points
    21
    Par défaut 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 : 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

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    C'est gentil de nous faire part de ton travail, mais quelle est ta question?

  3. #3
    Membre chevronné
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Points : 1 753
    Points
    1 753
    Par défaut
    Bonsoir
    En plus de ce qui a été dit, soit en écrit du code en langage C tout en respectant les normes et syntaxe soit en fait du langage C++ en respectant également les règles élémentaires car, le code est un mélange malsain de langage C et C++ sans compter certaine instruction qui sont inutile voir mal placer.
    de plus avec un compilateur plus sévère la source ne compilerait même pas.
    il y a pas mal de choses à revoir mais, avant quel est la question ?
    rappel la fonction pthread_exit() ne rend jamais la main.
    à bientôt

Discussions similaires

  1. Problème avec des threads
    Par rajuto dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 11/02/2007, 20h41
  2. IPC - Files de messages - Structure des messages
    Par Mattius007 dans le forum C
    Réponses: 2
    Dernier message: 03/01/2007, 10h51
  3. Faire un sleep non blockant avec des threads
    Par mobscene dans le forum Langage
    Réponses: 7
    Dernier message: 15/12/2006, 19h31
  4. [Threads] Actions continues avec des threads
    Par MiJack dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 10/10/2005, 17h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo