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

Threads & Processus C++ Discussion :

select + thread


Sujet :

Threads & Processus C++

  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 19
    Par défaut select + thread
    Bonjour,

    Voici ma situation actuelle. Je dois réaliser des ping vers différentes machines dont le nombre peut varier. Pour cela je crée autant de thread qu'il y a de machines à pinger.
    Je souhaite ensuite réaliser moi même le ping plutôt que de passer par une commande system(). J'ai donc implémenter mon programme de cette façon :

    Créer les thread
    Créer les Winsock
    Créer un timer par thread à 5 secondes
    Réaliser mon BOOL = Ping() à chaque fin de timer

    Dans la fonction Ping()
    - Créer une Raw socket
    - SendICMPRequest()
    - BOOL = WaitForICMPReply()
    - Si TRUE Alors RecvICMPReply()
    - Fermer la socket
    - Retourner le résultat.

    Mon problème survient dans le WaitForEchoReply(). J'ai une fonction select() juste sur une socket (celle du thread qui tourne en fait) pour vérifier si on a un timeout (à 1 seconde) et un FD_ISSET si on a reçu quelque chose sur la socket.

    Et la je me retrouve avec des cas bizarres. J'ai des réceptions de messages de machines absentes et inversement. C'est comme si lorsqu'une machine est présente alors cela fait sauter le timeout d'une machine absente par exemple.

    Alors je me demande : est-ce que un select() fonctionne avec des thread ? Sinon je suis totalement perdu, mes socket sont bien différentes et pourtant mes réceptions ou timeout sont totalement mélangé.

    J'espère que vous pourrez m'aider.
    Merci.

    PS : Si je ne suis pas assez clair, j'essayerais de plus détailler mon code.

  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
    Par défaut
    Tu utilises sûrement mal select.
    À noter que tu n'as nullement besoin d'un thread par requête.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Tamatea Voir le message
    est-ce que un select() fonctionne avec des thread ?
    OUI, select() fonctionne avec les thread (sinon, cela se saurait)

    Une indication de l'OS sur lequel tu développes aurait été une bonne idée
    Je vais donc supposer que c'est du Microsoft bien que je pense que le problème (qui n'en est pas un d'ailleurs) décrit par Microsoft existe aussi sur les autres plateformes.

    Lu ici : http://msdn2.microsoft.com/en-us/library/ms740548.aspx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    It is important to understand that SOCK_RAW sockets may get many
    unexpected datagrams. For example, a PING program may use SOCK_RAW
    sockets to send ICMP echo requests. While the application is expecting ICMP
    echo responses, all other ICMP messages (such as ICMP
    HOST_UNREACHABLE) may be delivered to this application also. Moreover, if
    several SOCK_RAW sockets are open on a computer at the same time, the
    same datagrams may be delivered to all the open sockets. An application
    must have a mechanism to recognize its datagram and to ignore all others.
    Such mechanism may include inspecting the received IP header–using unique
    identifiers in the ICMP header (ProcessID, for example), and so forth.
    Dans ta fonction SendICMPRequest(), il faut absolument que tu aies dans le message ICMP quelquechose qui identifie de manière unique ton contexte. Cela peut être le thread ID ou alors le numéro de socket, peu importe.
    Dans ta fonction WaitForICMPReply(), il faut absolumment que tu réagisses uniquement à cet identifiant de contexte.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 53
    Par défaut
    Bonjour,
    Je te conseillerai de faire un seul socket qui envoie et qui reçoit. Tu met un les Pcs à "pinger" dans une liste et tu les envois tous avec comme message à l'intérieur, la valeur retourné par QueryPerformanceCounter.
    Quand tu reçois un ping tu compare avec un nouveau QueryPerformanceCounter avec celui du message et tu ajoute l'adresse pc et le ping associé dans une liste. Il te reste juste apres a faire une limite de temps avec select et c'est bon.
    Ps: QueryPerformanceCounter cela marche pour windows mais peut être(surement) pas pour linux

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Pourquoi QueryPerformanceCounter() ?

    Qu'est ce que cela apporte par rapport au numéro de socket ou à l'identifiant de thread ou même un numéro auto incrémenté ?

    Ceci dit, tu as raison, avec un seul socket, c'est mieux et c'est faisable.
    De plus, avec un seul thread c'est faisable aussi.

    Il suffit d'avoir une liste de contextes, d'envoyer les paquets ICMP correspondant à ces contextes, d'attendre une réponse et enfin de retrouver le contexte associé pour traiter la réception.

    Donc, je suis d'accord, un seul socket et un seul thread c'est mieux. En plus, tu ne risques pas d'effondrer les perf de ta machine si un jour tu as 500 PC à pinger donc 500 threads et 500 sockets à créer avec ton modele, il faut avoir du souffle (une bonne CPU et de la mémoire) pour éponger la charge:-)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 53
    Par défaut
    Peut être veut t'il avoir le temps mis par la requête, pour faire l'allé-retour? si il a besoin de plus que de savoir si le pc est branché

  7. #7
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 19
    Par défaut
    Hmm ok, je vais voir tout çà merci
    Je travail sous Windows pour répondre à la question.

    Pour l'instant j'utilise provisoirement la commande system(commande) avec comme commande : "ping -n 1 adresseIP". Par contre la ou j'ai un comportement bizarre, c'est que mon application tourne en tache de fond en tant que Service Windows. Et le problème c'est que la commande system() m'ouvre des fenêtres CMD.exe sans arrêt, à chaque PING en fait, et les ferme immédiatement. J'ai déjà redirigé la sortie vers > NUL. Dès que j'ai un certain nombre d'équipement à tester j'ai des dizaines de fenêtre qui s'ouvre et se ferme
    Y a-t-il une option pour ne pas afficher la fenêtre CMD avec la commande system() ? Je vais chercher çà dans la donc sur MSDN mais si vous avez des info je suis preneur.

    Encore merci

Discussions similaires

  1. Classes partagées entre deux threads, et erreur sur select()
    Par DakM dans le forum Threads & Processus
    Réponses: 1
    Dernier message: 11/05/2012, 17h21
  2. [Programmation PHP] Read, Select, Thread
    Par Bobby le Chat dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 11/06/2010, 15h49
  3. Thread et select + adresse internet
    Par flo_k dans le forum Réseau
    Réponses: 3
    Dernier message: 23/05/2008, 01h56
  4. Réponses: 2
    Dernier message: 17/02/2008, 20h21
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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