Bonjour ,

je dois réaliser un mini chat serveur-client à l'aide des files de messages.

J'ai un problème lorsque le serveur récupère les messages, il récupère et affiches tous les anciens messages avant de récupérer le nouveau. Or avec le msgrcv, il devrait à chaque fois retirer les messages de la file .. Ya quelquechose que j'ai pas compris ..

voila le résultat d'un petit test :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
u2 : Bonjour u1
 
u1 : Bonjour u2
 
u2 : Bonjour u1
u2 : comment ca va u1 ?
 
u1 : Bonjour u2
u1 : bien et toi u2 ?
mon fichier servchat.c :

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
//
//  servchat.c
//  
 
#include <stdio.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/msg.h>
 
 
struct msgbuf
{
  long mtype;
  char mtext[128];
  char pseudo[30];
};
 
int main (int argc, char *argv[])
{
    key_t cle;
 
    int nbmaxi; // nombre maxi de connections
    int timeout; // timeout pour la deconnection
    int read; // lecture dans la file
 
    if(argc!=5)
    {
      perror("commande : servchat [-n <nbmaxi > -t <timeout>]\n");
      exit(EXIT_FAILURE);
    }
 
    if(strcmp(argv[1],"-n")==0) // premier argument -n
    {
      nbmaxi=atoi(argv[2]);
 
      if(strcmp(argv[3],"-t")==0) // deuxième argument -t
      {
        timeout=atoi(argv[4]);
 
      }
      else
      {
        perror("commande : servchat [-n <nbmaxi > -t <timeout>]\n");
        exit(EXIT_FAILURE);
      }
    }
    else
    {
      perror("commande : servchat [-n <nbmaxi > -t <timeout>]\n");
      exit(EXIT_FAILURE);
    }
 
 
    cle=ftok("/Users/Joke/Documents/cours/M1/Système/projet/CLE",'a'); // création de la clef
 
    int msqid;
    msqid =msgget(cle,IPC_CREAT|0666);
 
 
  while(1)
  {
    struct msgbuf msgp;
    read=msgrcv(msqid,&msgp,128,0,0);
 
    if (read == -1)
    {
      perror("Erreur de lecture dans la file\n");
      exit(EXIT_FAILURE);
    }
 
 
    printf("%s\n",msgp.mtext);
 
 
  }
 
 
 
 
}
mon fichier chat.c :
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 #include <stdio.h> 
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h> 
 #include <sys/types.h> 
 #include <unistd.h>
 #include <sys/wait.h> 
 #include <fcntl.h>
 #include <sys/types.h>
 #include <sys/ipc.h> 
 #include <sys/sem.h>
 #include <sys/msg.h>
 
 
struct msgbuf { 
	long mtype; 
	char mtext[128];
 
};
/*struct connect {
	char pseudo[30];
	int pid;
}*/
 
int main(int argc, char *argv[]){
	int taille, write, msqid;
    key_t cle;
	//struct connect identite;
	struct msgbuf message;
	printf("debut client \n");
	int i;
 
	if(strcmp(argv[1],"-p")==0) // premier argument -p 
	{ 
		printf("Pseudo : %s\n",argv[2]);
	}
 
 
	cle=ftok("/Users/Joke/Documents/cours/M1/Systeme/projet/CLE",'a'); // création de la clef
	msqid =msgget(cle,0666);
	if (msqid == -1)
    {
      perror("Erreur creation de file\n");
      exit(EXIT_FAILURE);
    }
 
	//info concernant l'user
	/*identite.pseudo= argv[2];
	identite.pid=getpid();
	write= msgsnd(msqid, &identite,sizeof(identite),0);
        if (write != 0)
        {
            perror("Erreur envoi identite\n");
            exit(EXIT_FAILURE);
        }
 
        else
        {
          printf("identite send\n");
        }
	*/
 
 
	while(1){
 
		message.mtype= 1; // si = 0 ca plante -> invalid argument
    char mess[158]; // message contenant le pseudo et le message
		char mes[128];
		printf("Tapez une phrase : \n"); 
		fgets(mes, sizeof(mes), stdin);
 
    strcat(mess,argv[2]);
    strcat(mess," : ");
    strcat(mess,mes);
 
		strcpy(message.mtext,mess);
 
    write= msgsnd(msqid, &message,sizeof(message.mtext),0);
		if (write != 0)
		{
			perror("Erreur envoi message\n");
			exit(EXIT_FAILURE);
		}
 
 
	}
 
}
Merci d'avance pour votre aide