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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
void handler(int sig) {
if (sig == SIGINT || sig == SIGQUIT){
printf("Terminaison du serveur en cours ...\n");
switch (type_serveur) {
case SHM :
break;
case MSG :
if (msgctl(identifiant, 0, NULL) == -1 ) {
error("Erreur lors de la destruction de la file de message.\n");
}
break;
case PIPE :
if (unlink(NOM_PIPE_Q) == -1) {
error("Erreur destruction tube question.");
}
if (close(identifiant) == -1) {
error("Erreur fermeture tube question.");
}
if (unlink(NOM_PIPE_R) == -1) {
error("Erreur destruction tube réponse.");
}
if (close(identifiant2) == -1) {
error("Erreur fermeture tube réponse.");
}
break;
default :
error("Impossible de créer le serveur.\n");
}
printf("Serveur detruit\n");
exit(EXIT_SUCCESS);
} else if (sig == SIGCHLD) {
int w = 0;
do {
w = waitpid(-1, 0, WNOHANG);
} while (w != 0 || w != -1);
}
}
int main (int argc, char** argv) {
if (argc != 2) {
error("Usage : ./serveur [-s | -m | -t].");
}
get_type_serveur(argv[1]);
if (type_serveur == 0) {
error("Usage : ./serveur [-s | -m | -t].");
}
nombre_client = 0;
key_t key = ftok("serveur.c", 1);
if (key == -1) {
error("Une erreur de création de clé a eut lieu.");
}
signal(SIGQUIT, handler);
signal(SIGINT, handler);
signal(SIGCHLD, handler);
switch (type_serveur) {
case 1 :
creer_serveur_semaphore(key);
lancer_serveur_semaphore();
break;
case 2 :
creer_serveur_message(key);
lancer_serveur_message();
break;
case 3 :
creer_serveur_tube(key);
lancer_serveur_tube();
break;
}
exit(EXIT_SUCCESS);
}
void get_type_serveur(char* type) {
if (!strcmp(type, "-s")) {
type_serveur = SHM;
} else if (!strcmp(type, "-m")) {
type_serveur = MSG;
} else if (!strcmp(type, "-t")) {
type_serveur = PIPE;
} else {
type_serveur = 0;
}
}
void creer_serveur_tube(key_t key) {
if (mkfifo(NOM_PIPE_Q, IPC_CREAT | 0666) == -1) {
error("Erreur création tube question.\n");
}
identifiant = open(NOM_PIPE_Q, 0666);
if (identifiant == -1) {
error("Erreur ouverture tube question.\n");
}
if (mkfifo(NOM_PIPE_R, IPC_CREAT | 0666) == -1) {
error("Erreur création tube question.\n");
}
identifiant2 = open(NOM_PIPE_R, 0666);
if (identifiant2 == -1) {
error("Erreur ouverture tube réponse.\n");
}
}
void lancer_serveur_tube() {
struct msg_question question;
struct msg_reponse reponse;
while (1) {
if (read(identifiant, &question, sizeof(question)) <= 0) {
reponse.type = question.type;
nombre_client++;
sprintf(reponse.text, "%s", "Problème de transmission.\n");
identifiant2 = open(NOM_PIPE_R, 0666);
if (identifiant2 == -1) {
error("Erreur ouverture tube réponse.\n");
}
if (write(identifiant2, &reponse, sizeof(reponse)) == -1) {
error("Problème d'écriture dans le tube.\n");
}
if (close(identifiant2) == -1) {
error("Erreur fermeture tube réponse.");
}
printf("Client : %ld\n", nombre_client);
kill(question.id, SIGUSR1);
error("Problème de lecture dans le tube.\n");
} else {
nombre_client++;
printf("Client : %ld\n", nombre_client);
switch (fork()) {
case -1 :
error("La duplication a échoué.");
case 0 :
traiter_demande_client(question, &reponse);
if (write(identifiant2, &reponse, sizeof(reponse)) == -1) {
error("Problème d'écriture dans le tube.\n");
}
kill(question.id, SIGUSR1);
exit(EXIT_SUCCESS);
}
}
}
} |
Partager