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

C++ Discussion :

Serveur multi-thread avec beaucoup de connexions TCP


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Serveur multi-thread avec beaucoup de connexions TCP
    Je dois réaliser un serveur qui pourrait avoir de très nombreuses connexions ouvertes en permanence mais avec peu de traffic. (type messagerie instantanée).

    Le facteur limitant n'est apparemment pas le nombre de connexion TCP simultanées que je peux maintenir établie, mais plutôt le nombre de threads.
    On peut repousser cette limite à l'aide d'un thread pool, mais cela ne suffit pas car le traitement d'une requête peut impliquer l'attente de données supplémentaires. Si le client distant ne transmet pas de données, le thread est alors bloqué et ne peut être affecté à une autre tâche.

    Ceci provient du fait que l'appel au read/recv de données supplémentaires se fait dans des appels de fonctions invoquées par le traitement de la tâche a effectuer. Il n'est alors pas possible d'interrompre le traitement pour le reprendre plus tard là où on l'a interrompu lorsque les nouvelles données sont arrivées.

    Le serveur se trouve ainsi exposé à des attaques DOS où les threads sont bloqués volontairement en attente de données. Je pourrais mettre un timeout, mais une longue attente peut aussi être une situation normale. Je souhaiterais donc simplement que le thread ne soit pas bloqué en attente de read.

    Il semble apparemment que c'est la technique de coroutine qu'il me faudrait utiliser. J'ai trouvé le package suivant pour réaliser cela. http://www.goron.de/~froese/coro/

    Il y a aussi GNU Pth, mais je crains que l'utilisation dans une applicaton C++ demande une attention particulière. Quelle que soit la solution, cela risque d'être subtil a concevoir et à programmer.

    Je voudrais donc savoir si ce problème a déjà été résolu et si oui comment.
    Je voudrais aussi savoir dans quelle mesure le nombre de threads est un facteur limitant. Au fait quelle est la limite maximal du nombre de thread qu'on peut avoir sur un ordinateur linux 2.6 ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Commence par regarder du côté de asio.
    http://asio.sourceforge.net/

    Après y'a des projets de coroutines en C++, comme boost.coroutine, qui permettent de rendre ça plus pratique à programmer.
    Mais boost.coroutine est encore au stade CVS et la doc est difficilement accessible car sur un serveur qui limite la bande passante.

Discussions similaires

  1. [C++][serveur multi-threads] prob de connection
    Par Just_the_boss dans le forum C++
    Réponses: 4
    Dernier message: 23/02/2006, 20h09
  2. [Socket] un serveur multi thread
    Par mzt.insat dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 12/11/2005, 14h25
  3. Réponses: 7
    Dernier message: 19/10/2004, 20h09
  4. Réponses: 16
    Dernier message: 30/01/2004, 12h05
  5. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 13h01

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