salut tout le monde
voila mon probleme, j'ai 2 process un serveur et un client (il peut y avoir plusieurs client) qui communiquent l'un par une fifo (du client au serveur) et l'autre par un message Q(du serveur au client). le serveur lui lit en boucle la fifo pour voir si rien ne se trouve dessus, et repond au client que si necessaire... le probleme est que lorsque je lis ma fifo lors de la lecture si il ya qq chose dans ma fifo tout vas bien, mais si il n'y a rien dedans c'est comme si mon process 'server' était gélé jusqu'a ce qu'il yait qq chsoe dedans :s.

C'est qq voit ou est mon probleme qu'il parle car la je retourne encore la question et je vois pas :s

je laisse une partie de mon code coté server au cas ou ...


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
      /******************SET FIFO******************************************/ 	if(mkfifo(PATH_FIFO,0777)<0){ 		if(errno!=EEXIST){ 			perror("Erreur mkfifo"); 			exit(EXIT_FAILURE); 		}else{ 			perror("fifo already exists, but show must go on :p"); 		} 	} 	printf("jouvre la fifo qui se trouve %s\n", PATH_FIFO); 	if((fifo=open(PATH_FIFO,O_RDONLY))<0){ 		perror("Erreur open"); 		exit(EXIT_FAILURE); 	} 	printf("fifo ouverte en read\n"); 	 /****************ON COMMENCE LA PARTIE ICI******************************/	 	jeux=0; 	joueurCourant=-1; 	joue=0; 	while(1){ 		int nbcar=0; 		if(jeux==0 && nombre_de->joueur==5){ 			printf("la partie débute\n"); 			jeux=1; 		}  		if(jeux==0 && nombre_de->joueur>=2  && nombre_de->joueur<5){ 			printf("Dans 30sec on démarre la partie si ya pas dautre inscription\n"); 			alarm(30); 		}  		if(jeux==1 && joue==0){ 			joueurCourant = (joueurCourant+1)%nombre_de->joueur; 			msgMQ->pid=tabPid[joueurCourant]; 			msgMQ->type = 'J'; 			joue=1; 			if(msgsnd(msgq_id,msgMQ,sizeof(struct msgMQ),IPC_NOWAIT)<0){ 				perror("Erreur msgsnd"); 				exit(EXIT_FAILURE); 			} 			printf("prochain joueur %d\n",tabPid[joueurCourant]); 			kill(tabPid[joueurCourant],SIGUSR1); 		}
/*c'est ici que ca foire **/ 
                :mouarf:if((nbcar=read(fifo,sonMsg,sizeof(struct msgFifo))) <=0){
			continue;
		}

		if(sonMsg->type=='I'){
			if(nombre_de->joueur<6 && jeux==0){
				printf("Oh on doit inscrire quelqu un\n");
				printf("nom : %s, prenom : %s, pid %d\n",sonMsg->nom,sonMsg->prenom,sonMsg->pid);
				strcpy(joueurs->tabJoueur[nombre_de->joueur].nom,sonMsg->nom);
				strcpy(joueurs->tabJoueur[nombre_de->joueur].prenom,sonMsg->prenom);
				tabPid[nombre_de->joueur]=sonMsg->pid;
				printf("SERVER a inscrit : %s %s\n", joueurs->tabJoueur[nombre_de->joueur].nom, joueurs->tabJoueur[nombre_de->joueur].prenom);
				nombre_de->joueur++;
				
				msgMQ->pid = sonMsg->pid;
				msgMQ->type = 'O';
				msgMQ->numJoueur = nombre_de->joueur;
				

				if(msgsnd(msgq_id,msgMQ,sizeof(struct msgMQ),IPC_NOWAIT)<0){
					perror("Erreur msgsnd");
					exit(EXIT_FAILURE);
				}
				kill(sonMsg->pid,SIGUSR1);
			}else{
				msgMQ->pid = sonMsg->pid;
				msgMQ->type = 'K';
				if(msgsnd(msgq_id,msgMQ,sizeof(struct msgMQ),IPC_NOWAIT)<0){
					perror("Erreur msgsnd");
					exit(EXIT_FAILURE);
				}
				kill(sonMsg->pid,SIGUSR1);
			}			
		}
		if(sonMsg->type=='P'){
			printf("Oh c'est une proposition\n");
        	}
		printf("il y a %d joueur\n",nombre_de->joueur);
	}
	printf("SERVER CLOSING\n");
	if(close(fifo)<0){
		perror("Erreur close");
		exit(EXIT_FAILURE);
	}
	shmdt(repartition);
	shmdt(nombre_de);
 	shmdt(joueurs);
	delmem(shm_id_nbr_nbj);
	delmem(shm_id_repart);
	delmem(shm_id_joueur);
	exit(0);
}