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 :

Socket et risque de blocage


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut Socket et risque de blocage
    Bonjour,

    J'ai un serveur qui accepte les connections client, et reçois des données.

    Est-il possible qu'un client réussisse à bloquer le serveur, en intérrompant l'envoie des paquets en plein milieu de l'envoi par exemple, ou par une quelconque autre méthode?

    Merci de vos réponses!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Ha toi de définir une limite de connexions que le serveur peut gérer pour commencer.

    Ensuite tu demande si un client qui commence à envoyer une donnée et coupe la connexion au milieu ferai planter le serveur, c'est bien ça?

  3. #3
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    Oui, la question ne concernait pas le nombre de client acceptés, mais le risque de blocage du serveur par un client, de façon accidentelle ou non.

    Je pensais par exemple à un envoi incomplet (connection réinitialisée en plein milieu de l'envoi par exemple). Mais il y a peut être d'autres soucis qui pourraient survenir.

    Existe-t'il par exemple un moyen de dire "si le serveur ne reçoit pas le paquet en moins de x secondes, on interromp l'action" (on ne parle ici pas de taille de données, mais bien de temps de réception) ? Histoire de ne pas bloquer un thread pendant 5mn, alors que le client devait juste envoyer un paquet contenant son identifiant...

  4. #4
    Membre chevronné Avatar de pascal.barbier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 362
    Par défaut
    A mon avis la bonne approche est de créer un nouveau thread dans le serveur pour chaque client qui se connecte. Ainsi, quoi qu'il arrive, le scheduling entre les threads du système empêche tout blocage (à moins d'un plantage complet du process bien sur).

    Hope it helps

  5. #5
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    Merci de ta réponse. Je vois ce dont tu veux parler, mais ce n'est pas toujours utilisable.

    - Pour des actions très courtes par exemple, le temps pour créer le thread et le détruire peut être non-négligeable par rapport au temps de traitement. On a donc une perte de performance.

    - Imaginons que pour une raison quelconque, certains clients n'arrivent pas à communiquer avec le serveur une fois connecté, ou envoient systématiquement des données incomplètes (bug du client, attaque en règle de ton serveur, ....). Tu vas avoir x threads de créés, qui ne seront jamais détruits. Si tu limites le nombre de threads créés, ton serveur sera donc tôt ou tard bloqué, une fois cette limite atteinte. Même si tu ne fixes pas cette limite, il y aura toujours une limitation matérielle : ton OS n'est pas trop prévu pour avoir des milliers de threads, même inactifs. A force d'en créer, il va probablement planter...

    Je pense avoir trouvé la réponse ici : http://www.quantic-storm.com/qs/inde...ro&language=FR avec l'utilisation de select. Ca m'a l'air assez complexe (je parle par rapport à une fonction qui aurait implémenté ça d'office dans une librairie standard :p ), mais assez propre et portable.

    Cependant, si vous en savez plus, n'hésitez pas à me dire quoi, je suis toujours preneur !

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Est-ce que tu sais comment marchent les sockets au moins?

    Sur ton serveur, tu as un socket qui attend une connexion. Ton client se connecte et ton serveur accepte la connexion et tu lances un thread pour gérer les échanges avec ce client. A partir de là, si le client se déconnecte ou si un problème réseau survient, ton socket sur le serveur le sait et pourra t'en avertir ce qui te permet à toi de détruire le thread que tu avais dédié à ce client.
    Ainsi, tu aura le même nombre de thread que de client connecté et "valides".

    Enfin moi j'ai fait comme ça et ça fonctionne plutôt bien.

Discussions similaires

  1. Socket et blocage
    Par charlie.camus dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 14/04/2010, 15h33
  2. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  3. Socket:Envoyer du texte d'un serveur vers tout les clients
    Par cedm78 dans le forum Web & réseau
    Réponses: 7
    Dernier message: 01/08/2002, 16h40
  4. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

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