Bonjour,
Je suis en train de réaliser un client - serveur utilisant les tubes nommées.
Malheureusement, le serveur répond au premier client mais pas aux autres.
De plus, est-il possible de mettre le serveur en attente passive.

Voici mon code :
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
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);
			}
		}
	}
}