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 :
mon fichier servchat.c :
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 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 // // 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); } }
Merci d'avance pour votre aide
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); } } }
Partager