Réalisation d'un proxy HTTP, gestion des connexions par fork
Bonjour,
Dans le cadre de la réalisation d'un proxy HTTP, je m'interroge sur la façon appropriée de gérer les connexions. Je développe en C sous GNU/Linux, et j'utilise les sockets TCP.
Actuellement, je dispose d'un processus père qui écoute sur un socket. Quand une connexion arrive, fork est appelé pour créer un processus fils qui gère la connexion, et le père attend une nouvelle connexion. L'inconvénient étant qu'en cas de nombreuses connexions, le nombre de processus explose...
Mon idée est d'utiliser un processus père qui attend les nouvelles connexions, et un petit nombre (disons dix) de processus fils, créés à l'avance, qui gèrent les nouvelles connexions. Quand une nouvelle connexion arrive, le processus père cherche parmi les processus fils un qui soit en attente, pour lui indiquer de gérer cette connexion. Avec l'inconvénient que si les dix processus fils sont occupés (en cas de charge élevée), la connexion ne pourra pas être gérée immédiatement.
L'autre problème posé (dans les deux cas) est le cas des connexions persistantes. Entre client et proxy, impossible d'affecter une connexion à un processus fils, sinon seules dix connexions pourraient être ouvertes (ou bien il faudrait sans cesse fermer et rouvrir des connexions, on perd l'intérêt de la persistance) ; et il n'est pas non plus question de faire un fork à chaque nouvelle connexion... Je pensais faire en sorte que chacun des processus fils puisse gérer plusieurs connexions client-proxy (en utilisant un select par exemple, pour voir quel socket a des données en attente) et plusieurs connexions proxy-serveur, mais dans ce cas, si une requête ou une réponse est longue, les autres connexions affectées au même processus seront délaissées tant que toutes les données n'auront pas été transférées...
J'ai pensé utiliser les threads, mais de la même façon que les processus, il vaut mieux éviter d'en avoir un trop grand nombre, non ?
Voilà où en est ma réflexion. Si vous avez des avis sur la question, je suis preneur.
Merci d'avance.