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

Linux Discussion :

Programmer files de messages


Sujet :

Linux

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut Programmer files de messages
    Bonjour,
    je dois simuler une situation client-serveur en utilisant les messages queues mais je ne sais pas comment je peux commencer...
    le but c'est de créer une espèce de jeu de golf.. et les joueurs doivent s'inscrire au serveur. pour pouvoir jouer..
    si j'aimerai au moins pouvoir faire communiquer les jouerus (client) et les serveurs.
    les joueurs seront identifies par leur process ID.
    on m'a dit qu'on pourrais créer un serveur iteratif? est ce possible?
    je ne sais vraiment par ou commencer.. j'ai deja lu msgget et sais quel fichiers inclure..
    merci.

  2. #2
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    je ne sais vraiment par ou commencer.. j'ai deja lu msgget et sais quel fichiers inclure..
    As tu déjà fait quelque chose?

    Comme pour tous les projets, papier crayon et tu dessines globalement comment doivent interragir les éléments de ton programme ensemble.

    En gros qu'est ce que doit pouvoir faire un client, un serveur ...

    le but c'est de créer une espèce de jeu de golf.. et les joueurs doivent s'inscrire au serveur.
    En gros, tu lances le serveur qui crée toutes les ressources IPC (puisque tu utlises msg***).

    Dès qu'un client est lancé, tu envoie un message à destination du serveur (à toi de bien remplir le champ destinatire de msgsend), le serveur enregistre le message et renvoie éventuellement un message au client pour lui dire qu'il est connecté (ou pas, sa connection peut être refusée, on ne sait jamais...).

    Ensuite,reste à toi de voir quels sont les autres actions à effectuer.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut
    merci pour ta réponse, elle est bienvenue.
    j'ai quelques exemples que j'ai pris d'internet,
    mais ce que j'ai déja imagine, mis sur papier est le suivant.
    un serveur itératif est lance avec mise en place des messages queues. le client, est crée dans une autre console (alt -fx)
    des qu'il se connecte il envoie son PID au serveur qui prend ce pid pour identifier un client aka joueur de facon unique et inéquivoque.
    et il devrait enregistrer cela dans un fichier imaginan dans un tableau de 18 cases une case par trou, chaque cellule de tableau a deux champs pid, et nombre de points; un client reste sur un 'trou' aussi longtemps que il n'as pas dit qu'il a termine; pour faciliter la chose je peux dire qu'il termine un trou lorsque il soumet les points.
    les problemes que je dois gérer de facon prioritaire est la communication, client serveur.. il faut au moins que je puisse envoyer le pid au serveur et qu'il le prenne; et aussi, il faut que j'utilise des signaux? pour eviter que deux jouers soient dans le meme trou? je m'explique si je lance le serveur dans tty1 et un client en tty2 et un autre en tty3, il faut que celui qui est en tty3 puisse etre dans le trou, et l'autre, doive attendre..
    ils doivent pas jouer, c'est la gestion.. car a la fin de dois faire un classement..
    voila; c'est cela l'esquellete de ce que je veux faire.
    je connais les focntions getpid(), et tout... mais pour le reste je suis dans le trouble.
    tout conseil est le bienvenu.
    merci beaucoup

  4. #4
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    des qu'il se connecte il envoie son PID au serveur
    C'est exactement ça.

    et il devrait enregistrer cela dans un fichier imaginan dans un tableau de 18 cases une case par trou
    Tu peux peut être avoir deux tableaux : un qui indique qui est dans le trou numéro n et un deuxième qui indique pour chaque client son nombre de points.

    Le premier peut être un fichier mais le mieux, c'est une mémoire partagée. Le deuxième est interne au serveur et n'a pas besoin d'être partagé.

    un client reste sur un 'trou' aussi longtemps que il n'as pas dit qu'il a termine; pour faciliter la chose je peux dire qu'il termine un trou lorsque il soumet les points.
    Qui s'occupe alors de changer de trou ? Que se passe t'il lorsque tu es au trou 8, qui tu as fini et qu'il y a quelqu'un au trou 9 ?

    les problemes que je dois gérer de facon prioritaire est la communication, client serveur.. il faut au moins que je puisse envoyer le pid au serveur et qu'il le prenne;
    le serveur crée la file de mesage, la clée IPC ..., il a un ID fixe. Le client lorsqu'il se connecte, récupère la clée IPC et envoie un message au serveur avec msgsnd.

    et aussi, il faut que j'utilise des signaux? pour eviter que deux jouers soient dans le meme trou?
    Utilise des mutexs sur la mémoire partagée : lorsqu'un client veut aller dans un trou, il prend le mutex, s'il n'y a personne, il continuera, s'il y a quelqu'un, il va attendre.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut
    qui s'occupe alors de changer de trou ? Que se passe t'il lorsque tu es au trou 8, qui tu as fini et qu'il y a quelqu'un au trou 9 ?
    normalement c'est le travail du serveur qui dois dire ok tu peux aller ou non, tu ne peux pas y aller.

    est il possible d'utiliser de la memoire partagée et des files de messages en même temps, je croyais qu'on devrait choisir un moyen de communication ou l'autre.

    merci.

  6. #6
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    est il possible d'utiliser de la memoire partagée et des files de messages en même temps
    Heureusement que oui !

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut
    bonjour,
    j j'ai le code suivant, que j'aimerai utiliser en tant que client.. j''ai les includes a fin qu'il puisse envoyer le PID, car en ce moment il n'envoi qu'un texte que je tape, c'est déjà un bon début mais pas suffissant.
    d'autre part, j'ai lu les man pour shmget() mais il y a des key_t que je comprends pas.
    je ne sais pas si tel qu'il est là, le client envoi deja le PID, et comme le serveur le rendra t il utilisable;.
    je prends en compte tous vos conseil, j'utilisera deux tableaux, mais dites moi c'est le serveur qui tiendront cela..
    en ce moment le serveur n'envoi rien au client.. est il possible de transmettre de massages de type : ok vas y lorsqu'il est permis d'aller dans un trou?

    pour les mutex; c'est la meme chose que des semaphores? je ne comprends pas beaucoup les faits du mutex.
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    /*
     * A message queue program that shows a client server implementation
     * this is the sender program using Message Queues 
     * aka client
     */
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
     
    #define MAX_TEXT 512
     
    struct my_msg_st 
    {
            long int my_msg_type;
            char some_text[MAX_TEXT];
    	    pid_t clientPID
    }
     
    int main(void)
    {
     	int running = 1;
    	int msgid;
    	int this_PID;
    	char ender[3] = "end";
    	struct my_msg_st some_data;
    	some_data.clientPID=getpid();
    	this_PID=some_data.clientPID;
    	char buffer[BUFSIZ];
    	system("clear");
    	msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
    	if (msgid == -1) 
    	{
    	  fprintf(stderr,"msgget failed with error : %d ", errno);
    	  exit(EXIT_FAILURE);
    	}
     
     while(running) 
     {
    //printf("this client pid = %d"some_data.clientPID);
    printf("Enter some text : ");
    fgets(buffer, BUFSIZ, stdin);
    	if (strncmp(buffer, ender,3) == 0 )
    	{ running = 0; }
    printf(" Text sent : %s ", buffer);
    some_data.my_msg_type = 1;
    strcpy(some_data.some_text, buffer);
     
     
    	if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1) 
    	{
    	 // perror("msgsnd error");
    	fprintf(stderr,"msgsnd failed ");
    	  exit(EXIT_FAILURE);
    	}
     
    }	
    	exit(EXIT_SUCCESS);
    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
    50
    51
    52
    53
     
    /*server */
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
     
    struct my_msg_st {
            long int my_msg_type;
            char some_text[BUFSIZ]; };
     
    int main(void)
    {
        int running = 1;
    	int msgid;
    	struct my_msg_st some_data;
    	long int msg_to_recieve = 0;
     
    	/* Let us set up the message queue */
    	msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
     
    	if (msgid == -1) {
    	  perror("msgget failed with error");
    	  exit(EXIT_FAILURE);
    	}
     
    	/* Then the messages are retrieved from the queue, until an end message is 
    	 * encountered. lastly the message queue is deleted
    	 */
     
    	while(running) {
    	  if (msgrcv(msgid, (void *)&some_data, BUFSIZ, 
    		     msg_to_recieve, 0) == -1) {
    	    perror("msgcrv failed with error");
    	    exit(EXIT_FAILURE);
    	  }
    	  printf("You wrote: %s", some_data.some_text);
    	  if (strncmp(some_data.some_text, "end", 3) == 0) {
    	    running = 0;
    	  }
    	}
     
    	if (msgctl(msgid, IPC_RMID, 0) == -1) {
    	  perror("msgctl(IPC_RMID) failed");
    	  exit(EXIT_FAILURE);
    	}
     
    	exit(EXIT_SUCCESS);
    }

  8. #8
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    j'ai lu les man pour shmget() mais il y a des key_t que je comprends pas.
    C'est la clé IPC que tu récupères avec ftok.

    je ne sais pas si tel qu'il est là, le client envoi deja le PID, et comme le serveur le rendra t il utilisable;.
    ça part mal, le tout n'est pas de récupérer à droite,à gauche du code mais de comprendre ce qu'il fait.

    je prends en compte tous vos conseil, j'utilisera deux tableaux, mais dites moi c'est le serveur qui tiendront cela..
    Ce n'était qu'une proposition, tu fais comme tu le veux... . Quelque soit la conception, c'est à toi de faire des choix qui te faciliteront la mise en oeuvre.

    est il possible de transmettre de massages de type : ok vas y lorsqu'il est permis d'aller dans un trou?
    Oui, en programmation tout est possible, reste à toi de savoir ce dont tu as besoin.

    pour les mutex; c'est la meme chose que des semaphores?
    Un mutex est tout simplement un semaphore à un jeton. Utilisé en règle générale pour protéger des zones mémoires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
    Un conseil, passe par ftok plutôt que mettre une clé en dur comme ça ...

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut
    il me semble que ta proposition sur les tableaux est la plus approprie pour ce cas ci.

    ce que j'ai compris jusque maintenant est:
    msgget cree une message queue avec un id, qui est de type entier. et c'est ce type entier qui est utilise dans le msgsnd pour envoyer la message dans telle ou telle autre file de messages.
    tous les messages que ont mtype = 1 sont a destination du serveur.
    ftok là je ne comprend pas les prototypes de la fonction, j'ai bien lire le man une et autre fois.. mais cela ne me dit rien.
    est-ce que les données envoyeés par message queue son récupérables dans une variable? ou quelque chose du style.
    désole d'être aussi "nul' mais programmation n'as jamais été mon point fort.
    merci d'avance.
    mario

  10. #10
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    msgget cree une message queue avec un id, qui est de type entier. et c'est ce type entier qui est utilise dans le msgsnd pour envoyer la message dans telle ou telle autre file de messages.
    Oui, ça permet de créer ou récupérer un id de file de message. (le serveur crée et le client récupère).

    tous les messages que ont mtype = 1 sont a destination du serveur.
    Ca, c'est toi qui choisi l'ID qui correspondra à l'ID du serveur. Ca peut être 1 ou 2 ou 3 ... . C'estune convention que tu te fixe pour tout ton programme.

    ftok là je ne comprend pas les prototypes de la fonction, j'ai bien lire le man une et autre fois.. mais cela ne me dit rien.
    Alors ftok permet de créer ou de récupérer une clée IPC. c'est cette clée que tu passes en premier argument de msgget ou shmget. Son fonctionnement est simple en fait.

    Une clé IPC est identifiée par un fichier sur le disque et un id de projet qui sont respectivement le premier et le deuxième argument de la fonction ftok.

    est-ce que les données envoyeés par message queue son récupérables dans une variable? ou quelque chose du style.
    Oui, heureusement !

    Quand tu envois un message, tu envoie une stucture composée d'au moins deux champs : un id et une chaîne de caractère (en fait on peut faire plus fin). Tu récupère le message toujours sous la forme d'une structure grâce à la fonction msgrcv.

    http://www.opengroup.org/pubs/online...sh/msgrcv.html

    désole d'être aussi "nul' mais programmation n'as jamais été mon point fort.
    Ca n'est pas être nul en programmation, c'est juste une méconnaissance des technologies IPC.

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut
    oui, la convention que j'ai prise est de mettre 1 pour mon serveur. mais comment faire pourque le serveur ne prenne que les messages sont de mtype 1? et pour mettre le type... il faut seulement charger la structure de facon arbitraire, comme par exemple:

    msbug.mtype=1;

    pour la data, je dois envoyer le pid, mais le pid est du type pid_t? dois je faire une sorte de casting, comme par exemple:
    lepid = getpid();
    et puis
    msbug.mtext=(char)lepid;

    ou je peux creer carrément une variable dans l'struct que msgsnd envoie en ajouter un champ pour le pid?
    dans le serveur ils mettent dans les exemples un while(1)? pourquoi? c'est dans ce while que les msgrcv sont mis, et qui permet en quelque sorte de mettre un serveur a l'écoute, et comment et a quel moment ce 1 devient 0?

    merci encore

  12. #12
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Dans le lien que je t'ai posté précédement tu as le proto de la fonction msgrcv:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long int msgtyp,
        int msgflg);
    l'argument msgtyp doit être 1 dans ton cas, ça veut dire que tous les messages qui sont envoyé avec le type 1 (pour le serveur) seront reçus.

    pour la data, je dois envoyer le pid, mais le pid est du type pid_t? dois je faire une sorte de casting, comme par exemple:
    lepid = getpid();
    et puis
    msbug.mtext=(char)lepid;
    Alors ce genre de truc, tu oublie et vite !

    En fait, le message que tu envoie est une structure qui doit obligatoirement avoir comme premier champ un entier long, ensuite, tu fait ce que tu veux.En gros tu peux avoir la structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct msgbuf
    {
         long m_type;
         pid_t expediteur;
    };
    Tu peux ensuite rajouter des champs. comme tu veux...

    dans le serveur ils mettent dans les exemples un while(1)? pourquoi?
    C'est une boucle infinie qui sert au serveur pour traiter les demandes du client, c'est pas forcément la meilleure façon mais bon pour un début ça peut aller.

    et comment et a quel moment ce 1 devient 0?
    Ben jamais, ah moins que tu arrives à me démontrer que mathématiquement parlant 1 == 0 (on montre facilement que 0.9999... == 1 mais 0 == 1 dans un système mathématique "normal", j'ai du mal ...)

    en fait, tu peux t'inspirer de ce que tu as posté avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    bool running = true;
    /* ... */
     
    while(running)
    {
         if( /* on a fini */ ) 
              running = false;
    }

  13. #13
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut
    j'ai en principe fait cela, je me suis inspiré de ce code, je ne l'ai pas copié d'ailleurs.
    je n'arrive pas a avoir ou a transmettre les PID? si je fait le test, ils ne sont pas identiques, et pas la moindre idée comment répondre au client, il faut mettre aussi infinie? c'est cela qui me pose de probleme en ce moment, voilà le code de serveur, s'il y a des abérations, dites le moi s'il te plaît.
    merci
    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
    50
    51
    52
     
    /* this ought to be the server of out program */
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <errno.h>
     
    /* redefinition of msgbuf struct */
    typedef struct mymsgbuf
    {
       long mtype;
       char mtext[50];
       pid_t C_PID;
    }mess_t;
     
    int main()
    {
    pid_t cl_pid;
    int lenght;
    int qid; //queue identifier.
    key_t msgkey;
    mess_t received;
    mess_t sent;  //messages sent
    mess_t tabply[19]; 
    mess_t holes[19];
    int rc;
     
    /*  lenght of the message */
    lenght=sizeof(mess_t) - sizeof(long);
    printf("lenght of the message = %d\n ", lenght);
     
    msgkey = ftok(".",'m');
     
    /* creation of the message queue */
    qid= msgget(msgkey, IPC_CREAT | 0660);
    printf("QID = %d\n", qid);
      if(qid == -1) {		
        perror("message queue could not be created");
        exit(EXIT_FAILURE);
       }//end if
    while(1){
    /* reception message client */
    msgrcv(qid,&received, lenght, sent.mtype,1);
     if (rc == -1){
          perror("message not received");
          exit(EXIT_FAILURE);
        }
     
    }//end main

  14. #14
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Alors bon, juste comme ça, la longueur en anglais, c'est length ...

    Deuxième chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgrcv(qid,&received, lenght, sent.mtype,1);
    send.mtype n'a jamais été initialisé donc on ne sais pas ce qu'il va récuppérer...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     if (rc == -1){
          perror("message not received");
          exit(EXIT_FAILURE);
        }
    C'est bien de faire des tests mais encore faut-il récupérer la valeur de rc ... .

    Il faut absolument que tu comprennes ce que tu fais, tu n'as pas seulement un problème de compréhension des protocoles IPC mais aussi des problèmes de programmation.

  15. #15
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut
    sent.mtype à été initialisé a un dans le client...
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    /* this ought to be the client of our program */
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <errno.h>
     
    /* redefinition of msgbuf struct */
    typedef struct mymsgbuf
    {
       long mtype;
       char mtext[50];
       pid_t C_PID;
    }mess_t;
     
    int main()
    {
    pid_t cl_pid;
    int lenght;
    int qid; //queue identifier.
    key_t msgkey;
    mess_t received;
    mess_t sent;  //messages sent
    int rc;
     
    /*  lenght of the message */
    lenght=sizeof(mess_t)- sizeof(long);
    printf("lenght of the message = %d\n ", lenght);
    sent.C_PID = getpid();
     
    msgkey = ftok(".",'m');
     
    /* creation of the message queue */
    qid= msgget(msgkey, IPC_CREAT | 0660);
    printf("QID = %d\n", qid);
      if(qid == -1) {		
        perror("message queue could not be created");
        exit(EXIT_FAILURE);
       }//end if
     
    /* build a message to be sent */
    sent.mtype = 1;
    sent.C_PID = getpid();
     
    /* sends the message */
    rc= msgsnd(qid,&sent,lenght,0);
    if (rc == -1) {
        perror("message could not be sent");
        exit(EXIT_FAILURE);
       } //end if
       else {
         printf("MESSAGE SENT, rc = %d \n",rc);
       } //end else
     
     
    }//end main
    rc est une variable.. comment je pourrais la récuperer? c'est le retour de la fonction msgsnd ou msgrcv qui est stocke la dessous, donc j'assume que j'ai des sérieux problemes de programmation, je te l'ai dit, mais il faut que j'essaie.
    merci d'avance
    mario

  16. #16
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut
    j'ai réussi a faire communiquer les processus, maintenant il faut que j'exploite ce qu'il y a dedans, donc c'est un probleme de programmation haut niveau,
    normalement un msgrcv a la l'structure complete que j'ai envoye avec le message, etc, je veux prendre cette structure et la mettre dans un tableau.
    j'ai declare un tableau avec le type de l'structure, j'ai aussi créé un compteur initialisé a zero, chaque fois qu'un client se connecte; il est incremente de 1, donc j'aimera que l'structure envoye par client 1 aille dans cellule 1 du tableau, client 2 cellule 2 et ainsi de suite?
    merci.

  17. #17
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    normalement un msgrcv a la l'structure complete que j'ai envoye avec le message, etc, je veux prendre cette structure et la mettre dans un tableau.
    Pourquoi mettre la structure complète dans le tableau ? Certain champs ne sont peut-être pas utiles. (mtype par exemple).

    j'ai declare un tableau avec le type de l'structure, j'ai aussi créé un compteur initialisé a zero, chaque fois qu'un client se connecte; il est incremente de 1, donc j'aimera que l'structure envoye par client 1 aille dans cellule 1 du tableau, client 2 cellule 2 et ainsi de suite?
    Pour cela, il faut que tu puisses faire un tableau d'association PID <-> numéro du client.

  18. #18
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut
    et bien... cela me laisse perplexe, j'ai jamais vu en aucun de mes notes, mes cours, ce qu'est un tableau d'association et je ne trouve pas des tutoriels sur developpez.com.
    la seule chose que j'ai pu faire et la suivante:
    declarer un pointeur type

    mess_T *tabply,

    puis
    tabply = malloc(5 * sizeof(mess_t));
    mais cela n'est pas un tableau d'association.

  19. #19
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    et bien... cela me laisse perplexe, j'ai jamais vu en aucun de mes notes, mes cours, ce qu'est un tableau d'association et je ne trouve pas des tutoriels sur developpez.com.
    C'était juste une façon de parler, ça n'est pas un type ou une structure du langage !

Discussions similaires

  1. programmation c sous unix , les files de messages
    Par élève_ingénieur dans le forum Linux
    Réponses: 4
    Dernier message: 07/12/2009, 22h43
  2. Créer plusieures file de message différentes
    Par progamer54 dans le forum Linux
    Réponses: 6
    Dernier message: 06/04/2006, 15h36
  3. Réponses: 8
    Dernier message: 09/02/2006, 18h51
  4. IPC : Files de messages et accès exclusif
    Par thomasvst dans le forum C
    Réponses: 2
    Dernier message: 07/12/2005, 09h47
  5. Réponses: 9
    Dernier message: 03/10/2005, 14h28

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