/* * serveur.corrige.c * * Rq: open RDWR au lieu de RD_ONLY du tube serveur * pour que le read n'echoue pas a la terminaison du client * en supposant la connexion avec le client terminee. * */ #include #include #include #include #include #include #include #include #include #include "client-serveur.corrige.h" void traiterRequete(requete_t *requete){ reponse_t reponse; char ligne[256]; FILE *f; int fdW; int nbWrite; /* Calcul reponse.pointAccesPrive */ strcpy(reponse.pointAccesPrive, ""); /* Le point d'accès privé n'est pas utilisé dans cette appli */ /* Calcul reponse.contenu */ f = fopen("mEtMme.txt", "r"); if (f == NULL) { perror("open(mEtMme.txt)"); exit(EXIT_FAILURE); } while (feof(f) == 0) { if (fgets(ligne, sizeof(ligne), f) != NULL) { if (strncmp(ligne, requete->contenu, strlen(requete->contenu)) == 0){ break; } } } if (feof(f) == 0) { strcpy(reponse.contenu, ligne); reponse.contenu[strlen(ligne)-1] = '\0'; /* Supprime le '\n' final */ } else { strcpy(reponse.contenu,"Desole, je ne le connais pas"); } fclose(f); /* Affichage */ printf("Serveur a recu \"%s\" et repond \"%s\"\n", requete->contenu, reponse.contenu ); /* Connexion au point d'accès client et réponse */ fdW = open(requete->pointAccesClient, O_WRONLY); if (fdW == -1) { perror("open(pointAccessClient)"); exit(EXIT_FAILURE); } nbWrite = write(fdW, &reponse, sizeof(reponse)); if (nbWrite < sizeof(reponse)) { perror("pb ecriture sur pipe nomme"); exit(EXIT_FAILURE); } /* Dans cette application, le client ne renvoie pas de requête ultérieure*/ /* nécessitant une réponse ==> On peut fermer ce tube */ close(fdW); } int main() { requete_t requete; int fdR; int nbRead; /* Création du tube nommé du serveur */ if (mkfifo(NOMPOINTACCESSERV, S_IRUSR|S_IWUSR) < 0) { if (errno != EEXIST) { perror("mkfifo(tube nommé client"); exit(EXIT_FAILURE); } else { printf("%s existe deja : on suppose que c'est un pipe nomme\n", NOMPOINTACCESSERV ); printf("et qu'on peut continuer le programme sans probleme\n"); puts(""); } } /* Ouverture de ce tube nommé (équivalent à une attente de connexion) */ fdR = open(NOMPOINTACCESSERV, O_RDWR); if (fdR == -1) { perror("open(tube nommé)"); exit(EXIT_FAILURE); } /* Boucle principale */ while (1) { /* Attente d'une requête */ nbRead = read(fdR, &requete, sizeof(requete)); if (nbRead != sizeof(requete)) { printf("Communication avec le client probablement rompue\n"); exit(EXIT_FAILURE); } /* On traite la requête */ traiterRequete(&requete); } close(fdR); return EXIT_SUCCESS; }