Bonjour,
Je suis en train de réaliser un serveur en C pour un projet. Pour information je suis sous environnement UNIX (darwin). Je me suis un peu documenté, c'est un peu compliqué sachant que les mans peuvent être quelquefois très mal faits.
Bref, j'ai regardé quelques exemples et tous, après le accept, utilisent un fork() pour régler le problème des sockets bloquantes. Pour ma part, je ne suis pas particulièrement fan de cette solution, et je me demandais si c'était la meilleure.
Ainsi, j'ai plutôt imaginé la structure de mon système ainsi :
- Le serveur, lancé par launchd, fait un unique fork (ou bien lance directement un binaire différent) pour lancer le démon de traitement, les deux sont reliés par deux pipes. Il s'occupe de l'interface avec le réseau, connecte et déconnecte les clients, parse les requètes (en XML), et les transmet au démon de traitement.
- Le démon de traitement reçoit les données de tous ses clients par une seule pipe, les traite, et en envoie au serveur par la seconde pipe, lequel dispatche aux clients.
Ainsi, le serveur ressemblerait à cela :
Et le démon de traitement :
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 exec('démon de traitement'); => pipe('to démon de traitement'); => pipe('from démon de traitement'); socket/bind('connexion extérieure'); => fcntl('non bloquante'); while(1) { accept('eventuel client'); => fcntl('non bloquante'); if(select('lecture pipe et connexions')) { recv('pipe from'); => send('client'); for('chaque client') { recv('client'); => send('pipe to'); } } }
Ainsi, amha, il n'y aurait pas besoin pour le démon de traitement de s'occuper de toute la gestion réseau et cela règlerait énormément de problème. Seulement, je n'ai jamais fait de programmation sockets auparavant et je voudrais valider ma méthodologie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 while(1) { if(select('lecture pipe')) { recv('pipe to'); => traitement(); => send('pipe from'); } }
- Est-ce une façon viable de faire ? Y a-t-il des importants points de blocage que je n'aurais pas vu ?
- Est ce que j'aurais besoin de mettre un test en écriture vers les sockets dans le select du serveur ou bien est ce que le tampon du système est assez grand pour ne jamais être overflowé ?
- Du coup, est ce que j'aurais besoin de tampons au niveau du serveur pour transmettre les données des connexions à la pipe et vice versa ?
Merci de vos réponses et éclaircissements, si vous avez des remarques supplémentaires, n'hésitez pas.
Partager