Bonjour,
Dans le cadre d'un projet, je dois créer un programme serveur-client en C. Le serveur doit gérer la connexion de plusieurs client simultanés.
Un client se connecte via une socket TCP avec le serveur mais avant le client doit récupérer l'adresse et le le port de la socket d'écoute du serveur. Le client récupère cette info en se "connectant" d'abord à un groupe multicast qui diffuse en boucle cette information. C'est le serveur qui s'occupe de créer et de mettre en place le multicast. Voilà grosso modo le principe du projet.
Le pseudo-code ci dessous est sensé représenté la structure de mon serveur.c. Je souhaite juste comprendre le principe de pthread.
- Un thread 1 se lance et exécute la fonction_a (on va dire que c'est cette fonction qui s'occupe de créer la socket UDP multicast et de diffuser en boucle le char * contenant l'ip/port)
- Un thread 2 lance la fonction_b qui s'occupe de créer et mettre en place la socket TCP (socket, bind, listen etc..)
- Un thread 3 qui lance la fonction_c qui s'occupe d'établir la connexion avec un client (listen, accept...) ET créer un thread pour chaque connexion.
Le cheminement dans le serveur.c est séquentiel, on exécute d'abord fonction_a puis fonction_b et enfin fonction_c.
Mon problème est que cela fonctionne très bien lorsqu'un premier client se connecte mais lorsque je lance une deuxième instance de client, il bloque à la première étape, c'est à dire pour récupérer l'info sur l'UDP multicast. Le client "n'atteint" pas la fonction_a (se connecter au groupe multicast pour l'info).
Déjà, est ce que la structure de mon serveur.c vous parait judicieuse (les 3 threads)? Comment faire pour que les 3 threads se lance en parralèle, dans l'ordre 1->2->3 et qu'elles soient "réutilisable" lorsqu'un 2eme client se connecte? Je ne sais pas si c'est assez clair et j'espère avoir de l'aide.
Merci d'avance
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 void fonction_a () { // créer un un groupe multicast qui diffuse l'info ip/port de la socket d'ecoute TCP while (1) { // fais un truc en boucle et diffuse en multicast une variable //sento(); } } void fonction_b () { // fonction qui fait grosso modo des trucs pour établir la connexion entre le serveur-client (creation socket, bind, listen etc..) } void fonction_c () { // accepte une connexion d'un client et lui créer un thread dédié } int main () { pthread_t thread_a, thread_b, thread_c; if (pthread_create (&thread_a, NULL, fonction_a, NULL) == -1) { // truc } if (pthread_create (&thread_b, NULL, fonction_b, NULL) == -1) { // truc } if (pthread_create (&thread_c, NULL, fonction_c, NULL) == -1) { // comment faire pour qu'à chaque connexion de client, on créer un thread pour un client à partir de ce thread? } pthread_join (fonction_a, NULL); pthread_join (fonction_b, NULL); pthread_join (fonction_c, NULL); return 0; }
EDIT: je peux poster le code complet si nécéssaire.
Partager