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 :

connexion socket utilisant des threads


Sujet :

C++

  1. #1
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut connexion socket utilisant des threads
    Bonsoir,

    J'aurais aimé avoir des renseignements, ainsi que des conseils argumentés d'exemples, sur la création et l'utilisation de threads. Je fais en fait un "bot irc" mais j'utilise une boucle infini, ce qui bouffe pas mal de ressource.. Et j'ai lu à maintes reprises que la solution serait l'utilisation de thread. Mais voila, je n'y connais rien! Et c'est pour cela que je fais appel à votre aide. Merci d'avance =]

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ta boucle infinie ne devrait pas "bouffer pas mal de ressource" : Normalement, l'attente est passive.
    De plus, tu n'as pas vraiment besoin de multi-socket ni de multithreading pour un petit client comme un bot.


    Pour le multithreading, je crois bien que ça dépend du système : Les systèmes unixoïdes ont leur interface (pthread, comme POSIX Thread), Win32 possède la sienne (_beginthreadex, _endthreadex).
    J'ignore s'il est possible ou d'utiliser les pthreads sous Win32, je n'ai rien trouvé pour l'instant (mais le moteur de recherche semble inaccessible)

    Et ne négligeons pas les bibliothèques portables, je ne sais plus si boost a quelque chose pour la gestion des threads...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    L'utilisation de Thread ne serait-elle pas mieux, qu'une boucle infinie ? Parce qu'elle ne reste pas totalement en attente, elle tourne sans cesse en vidant le buffer et en vérifiant s'il est vide ou pas.. N'y aurait-il pas un moyen pour qu'elle évite de tourner pour rien ? Je sais que je peux utiliser Sleep(), mais si le serveur envoie une information, lorsque je suis en période de "Sleep", je ne la recevrais pas à moins que cette période soit de très courte durée, ce qui est possible aussi. Au moins jça bouffera moins. En d'autre terme, qu'elle est la meilleure chose à faire pour ce bot ?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pour moi, la meilleure chose à faire est d'utiliser un socket bloquant, comme ça, tant que le bot ne reçoit rien, rien ne se passe.

    Et si tu veux que ta boucle ne soit plus infinie, ben... Tu fais un break si tu reçois sur le réseau l'ordre de quitter (ou aussi en cas d'erreur sur la connexion), c'est aussi simple que ça...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    C'est déjà ce que je fais, je vérifie si le buffer est vide ou non et je ferme le socket puis sort de la boucle s'il est vide. Quand tu parles de socket bloquant c'est de ça que tu parles ou tu as autre chose derrière la tête ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Le buffer ne sera vide que si le serveur ferme la connexion (peut-être suite à un /quit ou à un kick). Je pense qu'il faudrait rajouter un truc genre un ordre "quitte-toi" que tu pourrais lui envoyer via un client normal...

    Et par "bloquant", sachant que le socket est déjà bloquant par défaut, ton bot ne doit pas "consommer beaucoup de ressources" puisqu'il est inactif tant qu'il ne reçoit rien du serveur...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Non un kick ne ferme pas la connexion, il expulse juste la personne du salon. Et pour le quit oui c'est pour cela que je ferme le socket lorsque le buffer est vide. Donc au final il n'y a rien de plus à effectuer. Merci pour tes informations.

    NB: Et que pense tu de mon idée par rapport aux Sleep() ?

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Sleep() ne sert à rien puisque l'attente se fait sur le recv().

    Mais quand le serveur est-il supposé fermer unilatéralement la connexion du bot?
    Pour l'instant, on dirait que le bot ne peut se terminer que si le serveur veut bien le déconnecter...

    Bref: Si je suis loggué sur un serveur IRC, le bot aussi, et que je veux que le bot quitte, je fais comment ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Tu envoie une requête de quit, tout simplement. Et la connexion ne se ferme pas de lui même car je ne l'ai pas encore décidé lol.. Mais ça se fera enfin pas tout de suite..

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Euh... Puisque le coup des ressources est fini, on peut continuer:
    Pour fermer le bot, qui envoie la requête de quit à qui?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Le bot l'envoie au serveur sous la forme "QUIT :messsage de quit si existant", mais on peut quitter simplement en envoyant "QUIT".

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    et quand est-ce qu'il l'envoie, le message de quit ?
    qu'est-ce qu'il le fait envoyer?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Ce sera une personne ayant un certains niveau d'accès au bot qui pourra effectuer cette action sous forme de "commande" directement sur IRC.

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    OK. C'est ce que je pensais et ce que je préconise également.
    Maintenant, je sais ce qui est prévu (implémenté ou non).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    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
    Le multithreading est généralement inutile.
    En plus c'est problématique en C++.

    Pour tout cas il suffit de faire de l'asynchrone avec select par exemple.
    Boost ftw

  16. #16
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut creation de threads sous win
    il existe des mecanismes de creation de threads fourni par l'api windows tel que cela est decrit sur le site de msdn ...

    http://msdn.microsoft.com/library/de..._processes.asp

    j'ai testé et ca marche plutot bien

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    Par défaut
    oui utilises les fonctions comme poll ou select.

    ca permet d avoir une attente passive sur plusieurs sockets
    sans boucler ton process sera reveille sur evenements

    lien pour des exemples sur des system unix:
    http://www710.univ-lyon1.fr/~jciehl/.../socket.7.html
    et un exemple de poll
    http://www.khmere.com/freebsd_book/s..._socket.c.html

Discussions similaires

  1. Utilisation des threads pour les sockets
    Par Leaffy dans le forum Tcl/Tk
    Réponses: 7
    Dernier message: 23/08/2012, 09h52
  2. Réponses: 1
    Dernier message: 10/04/2010, 09h10
  3. Réponses: 18
    Dernier message: 16/02/2006, 10h08
  4. Utilisation des threads
    Par Valinor dans le forum Linux
    Réponses: 2
    Dernier message: 30/11/2005, 16h41
  5. Utilisations des Threads
    Par phoenix440 dans le forum Réseau
    Réponses: 15
    Dernier message: 21/08/2005, 17h19

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