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 averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 30
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    C'est gentil de nous faire part de ton travail, mais quelle est ta question?

  3. #3
    Membre très actif
    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
    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