IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Réalisation d'un proxy HTTP, gestion des connexions par fork


Sujet :

Réseau C

  1. #1
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut 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.

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Magus (Dave) Voir le message
    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 ?
    Bien sûr, il faut éviter d'en avoir trop, mais un thread est très très nettement moins coûteux qu'un processus... A l'heure où j'écris ce message, ma machine exécute 90 processus (ce qui est un peu élevé, je monte parfois à environ 200 mais quasiment jamais plus), et 769 threads (ce qui est une broutille, j'en ai presque 5000 quand elle tourne à plein régime)... Juste pour te donner une idée.

    Tu peux faire un pool de threads, et utiliser ensuite des structures gérant la persistance de la connexion ainsi que des select pour gérer tes connexions afin de pouvoir en accepter beaucoup plus.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    Vu que tu es sur un Linux, tu peux utiliser l'API "epoll()" qui gère très bien un très grand nombre de connexions par rapport à "select()".

    - Sockets non bloquants
    - utilisation de epoll
    - gestion des évènements sur le filedescriptor du socket qui écoute => accept()
    - évènements sur les sockets client => read() // write()

    (Tu peux utiliser libevent pour gérer tout ça)

    A lire : http://www.kegel.com/c10k.html

  4. #4
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut
    Merci pour vos réponses, j'ai à présent une meilleure idée de la façon de procéder. La lecture de http://www.kegel.com/c10k.html était également très intéressante.

    Je marque le topic comme Résolu mais je suis toujours preneur pour plus d'informations.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Proxy MSFT - Gestion des scripts de connexion
    Par Mothership dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 02/07/2009, 10h57
  2. Gestions des connexions
    Par blackshadow dans le forum ASP
    Réponses: 1
    Dernier message: 15/05/2008, 01h47
  3. [Multithread] Gestion des connexions
    Par Wookai dans le forum Accès aux données
    Réponses: 2
    Dernier message: 22/11/2007, 22h43
  4. [Tableaux] gestion des connexions
    Par zahiton dans le forum Langage
    Réponses: 3
    Dernier message: 02/11/2005, 14h37
  5. Réponses: 4
    Dernier message: 04/07/2002, 12h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo