Linux - problème avec fifos (comm IPC)

Fermé
wiliwiliwili Messages postés 1 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 23 août 2007 - 23 août 2007 à 19:58
 wiliwiliwili - 27 août 2007 à 10:56
Bonjour, je vous explique mon problème. Je dois réaliser un jeu de bataille navale en utilisant la communication inter proccessus (basé sur un serveur et 2 clients). Pour celà, j'utilise des fifos (via mkfifo()). Tout se passe bien lors de l'exécution du serveur. Le problème survient lors de l'exécution des clients, plus particulièrement pour le client 2 au niveau du changement de fifo (car client 1 ne communique pas sur le même canal que . En effet ceux-ci ne fonctionnent pas correctement lors du changement de fifo (car il faut que les clients communiquent via des canaux différent).
Ce qui est bizarre c'est que la procédure de changement de fifo me semble correcte. Lorsque celle çi est mise en commenctaire ça fonctionne.

pour infos, j'ai développé sous fedora.
Je vous montre le code ci dessous. C'est très répétitif je sais, je dois mettre en fct mais je voudrais d'abord que le début fonctionne.

voici le code du client

int main(){
int numclient;
char reponse[1];

/* creetab(&tableau);
affichetab(&tableau);
placerboat(&tableau);
*/
//connection vers serveur
int canalaller= open("client1",2);
int canalretour= open("serveur1",2);

if ((canalaller==-1) && (canalretour==-1)){
printf("\nConnection au serveur impossible.\nAppuyer sur enter pour quitter");
getchar();
exit(1);
}

//envoi de la demande de connection
printf("demande conn= %d",write(canalaller,"A",1));

//réception d'un # de client
printf("recep num= %d",read(canalretour,reponse,1));
printf("reponse=%c",reponse);
numclient=atoi(reponse);
printf("\nVous etes le joueur= %d",numclient);

//changement de fifos
if (numclient==1){
//pas de changement
}
else if (numclient==2){
puts("Changement de fifo");
close(canalaller);
close(canalretour);

canalaller=open("client2",2); //ouverture
canalretour=open("serveur2",2);

if ((canalaller==-1) && (canalretour==-1)){
printf("\nConnection au serveur impossible.\nAppuyer sur enter pour quitter");
getchar();
exit(1);
}
puts("1");
}

//attente du depart de serveur
read(canalretour,reponse,1);
printf("\nreponse= %c",reponse);
if (reponse!="Z") puts("\nServeur pas pret, veuillez recommencer");
/*
//encodage de la grille
puts("\nEncoder votre grille");
getchar();
//*******************
int i,j;
for (i=0; i<11; i++){
for (j=0; j<11; j++){
tableau[i][j]="A";
}
}

//envoi de la grille
write(canalaller,tableau,121);
read(canalretour,reponse,2); //ack
printf("\nackCL1: %c ",reponse);
puts("\nLa grille a bien été envoyee");
getchar();*/
}


voici le code du serveur

#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>

int main(){
char tmp, tmp2;
char suppr_serveur1[20+1]="rm -f serveur1";
char suppr_serveur2[20+1]="rm -f serveur2";
char suppr_client1[20+1]="rm -f client1";
char suppr_client2[20+1]="rm -f client2";
char grilleclients[2][11][11];
int ok=0;

//suppression des anciens fifos
//LA SUPPRESSION SE FAIT D'OFFICE
system(suppr_serveur1);
system(suppr_serveur2);
system(suppr_client1);
system(suppr_client2);

//Creation et ouverture du premier canal de communication
int A = mkfifo("serveur1", 0666);
if (A==-1) {
puts("\nProbleme de création de canal de communication");
puts("Appuyer sur enter pour quitter");
getchar();
exit(-1);
}
int canal1aller = open("serveur1",2);
if (canal1aller==-1) {
puts("\nProbleme d'ouverture du canal de communication");
puts("Appuyer sur enter pour quitter");
getchar();
exit(-1);
}

int C=mkfifo("client1", 0666);
if (C==-1) {
printf("\nC=%d",C);
puts("\nProbleme de création du canal de communication");
puts("Appuyer sur enter pour quitter");
getchar();
exit(-1);
}
int canal1retour=open("client1",2);
if (canal1retour==-1){
puts("\nProbleme d'ouverture du canal de communication");
puts("Appuyer sur enter pour quitter");
getchar();
exit(-1);
}

system("clear");
puts("Serveur pret.\nAttente du PREMIER joueur.");

//test présence joueur 1 + envoi num client
read(canal1retour, &tmp, 1);
if (tmp=='A') {
printf("\tClient 1 connecte.");
ok=1;
}
else {
puts("\nProbleme de connection avec premier joueur");
puts("Appuyer sur enter pour quitter");
getchar();
exit(-1);
}
write(canal1aller,"1",1); //client 1
puts("\nAttente du SECOND joueur.");

//test présence joueur 2 + envoi num client
read(canal1retour, &tmp2, 1);
if (tmp2=='A') {
printf("\tClient 2 connecte.");
ok=1;
}
else {
puts("\nProbleme de connection avec second joueur");
puts("Appuyer sur enter pour quitter");
getchar();
exit(-1);
}

write(canal1aller,"2",1); //client 2

//ouverture du second canal de communication
puts("\nTentative de creation et d'ouverture du second canal de communication");

int B = mkfifo("serveur2", 0666);
if (B==-1) {
puts("\nProbleme de création du canal de communication");
puts("Appuyer sur enter pour quitter");
getchar();
exit(-1);
}
int canal2aller = open("serveur2",2);
if (canal2aller==-1) {
puts("\nProbleme d'ouverture du canal de communication");
puts("Appuyer sur enter pour quitter");
getchar();
exit(-1);
}

int D=mkfifo("client2", 0666);
if (D==-1) {
printf("\nclient2=%d",D);
puts("\nProbleme de création du canal de communication");
puts("Appuyer sur enter pour quitter");
getchar();
exit(-1);
}
int canal2retour=open("client2",2);
if (canal2retour==-1) {
puts("\nProbleme d'ouverture du canal de communication");
puts("Appuyer sur enter pour quitter");
getchar();
exit(-1);
}

puts("\nLes deux canaux de communications sont etablis.");
puts("Les joueurs procedent à l'encodage de leur grille");

/*
canal1aller = serveur1: pour envoyer ou client1
canal2aller = serveur2: pour envoyer au client2
canal1retour = client1: pour reçevoir du client1
canal2retour = client2: pour recevoir du client2
*/

//Dit au 2 joueurs qu'ils peuvent encoder leur grilles
if (write(canal1aller,"Z",1)==1) printf("\nj1=OK"); else printf("\nj1=KO");
if (write(canal2aller,"Z",1)==1) printf("\nj2=OK"); else printf("\nj2=KO");
/*
//Reception des grilles.
//joueur 1
read(canal1retour,grilleclients[0],121);
write(canal1aller,"O",2); //accusé de réception grille joueur 1
//joueur 2
read(canal2retour,grilleclients[1],121);
write(canal2aller,"O",2); //accusé de réception grille joueur 2*/
}




Voilà. N'hésitez pas à posez vos questions. Merci
A voir également:

2 réponses

wiliwiliwili
26 août 2007 à 12:42
personne ne sait m'aider?
0
wiliwiliwili
27 août 2007 à 10:56
et merci en tout cas! 89% de réponses hum hum hum
0