#include #include #include #include #include #include #include #include "fonctions.h" #include "entrees_sorties.h" #define TAILLE_V 10 #define NOMTUBESERVEUR "./serveur-rpc" int fdR; void traiterRequete(int new_fdR, enum fonctions fnum, char*nomtube) { /* Réponse sur le tube nommé du client */ int fdW = open(nomtube, O_WRONLY); if (fdW == -1) { perror("open(nomtube)"); exit(EXIT_FAILURE); } switch(fnum) { case SOMME: { printf("Traitement d'une requete SOMME\n"); double a = read_double(new_fdR); double b = read_double(new_fdR); double res = somme(a, b); printf("envoi du res\n"); write_double(fdW, res); } break; case MUL: { printf("Traitement d'une requete MUL\n"); double a = read_double(new_fdR); double b = read_double(new_fdR); double res = mul(a, b); write_double(fdW, res); } break; case SOMMEV: { printf("Traitement d'une requete SOMMEV\n"); struct vecteur *a = read_vecteur(new_fdR); struct vecteur *b = read_vecteur(new_fdR); struct vecteur *res = new_vecteur(a->size); sommev(a, b, res); write_vecteur_allocated(fdW, res); free_vecteur(a); free_vecteur(b); free_vecteur(res); } break; case MULV: { printf("Traitement d'une requete MULV\n"); struct vecteur *a = read_vecteur(new_fdR); struct vecteur *b = read_vecteur(new_fdR); double res = mulv(a, b); write_double(fdW, res); free_vecteur(a); free_vecteur(b); } break; default: printf("Traitement d'une requete inconnue (%d)\n", fnum); break; } /* 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(int argc, char**argv) { int nbRead; /* Création du tube nommé côté serveur (qui permettra les communications */ /* client-serveur) */ if (mkfifo(NOMTUBESERVEUR, S_IRUSR|S_IWUSR) < 0) { if (errno != EEXIST) { perror("mkfifo(tube nommé serveur"); exit(EXIT_FAILURE); } } /* Ouverture de ce tube nommé */ fdR = open(NOMTUBESERVEUR, O_RDWR); if (fdR == -1) { perror("open(tube nommé)"); exit(EXIT_FAILURE); } /* Attente de requêtes */ do{ printf("En attente...\n"); char nomTubeConnexion[80]; int len; read_str(fdR, nomTubeConnexion, &len); int new_fdR = open(nomTubeConnexion, O_RDONLY); if (new_fdR == -1) { fprintf(stderr, "nom du tube new_fdR : %s\n", nomTubeConnexion); perror("open(nomtube)"); exit(EXIT_FAILURE); } enum fonctions fnum; nbRead = read(new_fdR, &fnum, sizeof(enum fonctions)); if (nbRead != sizeof(enum fonctions)) { perror("read sur tube nomme NOK"); return EXIT_FAILURE; } char nomtube[80]; read_str(new_fdR, nomtube, &len); /* On traite la requête */ traiterRequete(new_fdR, fnum, nomtube); }while(1); return 0; }