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

MFC Discussion :

UDP multicast et traitement de données


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Points : 116
    Points
    116
    Par défaut UDP multicast et traitement de données
    Bonjour

    Je reçois un flux important de données en UDP multicast (toutes les 5 ms) et je dois les traiter rapidement.
    J'ai donc une CAsyncSocket pour la réception et la récupération des data dans le OnReceive.
    Je fais transiter la trame via un PostMessage (qui n'est pas bloquant) à une classe qui s'occupe du traitement.
    Or j'arrive à avoir des pertes de réceptions (j'ai contrôlé l'émission pour être sûr).
    Pour moi, une CAsyncSocket est un thread et donc le message WM_RECEIVE est capté quoi qu'il arrive, et là ce n'est pas le cas.

    Pour info, j'ai mis mon traitement dans un thread.

    Est-ce que j'ai loupé quelque chose ?

    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 369
    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 369
    Points : 41 518
    Points
    41 518
    Par défaut
    J'ai vérifié dans les sources de MFC (2005):
    CAsyncSocket est juste un wrapper sur WSAAsyncSelect() utilisant une fenêtre globale au thread appelant (plutôt que prendre un HWND en paramètre).
    Et connaissant le fonctionnement de WSAAsyncSelect(), ça veut dire que le OnReceive() du CAsyncSocket est exécuté sur le thread appelant, et non sur un thread à part.

    Donc, si tu crées déjà ton CAsyncSocket depuis ton thread UI, le PostMessage() est une perte de temps.
    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
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    En plus de la remarque de @Médinoc, UDP n'est pas un protocole sécurisé en terme de perte de trame.
    Rien ne garantit qu'une trame émisse sera reçu par votre machine.
    Pour en être sûr, utilisez un sniffer réseau type Wireshark sur votre machine cliente qui vous permettra de voir si au moins la stack IP du système à bien réceptionner ces packets UDP.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Points : 116
    Points
    116
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Rien ne garantit qu'une trame émisse sera reçu par votre machine.
    J'ai vérifié ce point avant en m'assurant de bien tout recevoir si je ne fais pas de traitement après réception.

    Citation Envoyé par Médinoc Voir le message
    Et connaissant le fonctionnement de WSAAsyncSelect(), ça veut dire que le OnReceive() du CAsyncSocket est exécuté sur le thread appelant, et non sur un thread à part.
    Est-ce que la solution serait d'utiliser les fonctions de base [socket, bind, select, read/readfrom, shutdown, closesocket] ?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par coincoin73 Voir le message
    Est-ce que la solution serait d'utiliser les fonctions de base [socket, bind, select, read/readfrom, shutdown, closesocket] ?
    Si ton application est une application graphique, CAsyncSocket est approprié. Mais il faut faire les Receive() le plus vite possible (quitte à faire la MaJ des contrôles la fenêtre plus tard avec un timer ou un truc du genre), pas les "remettre à demain" dans un contexte où "demain" est mesuré en intervalles de 15.625ms.
    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.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Points : 116
    Points
    116
    Par défaut
    Est-ce que je n'ai pas intérêt à faire du polling à la place du OnReceive ?

Discussions similaires

  1. [MySQL] PB traitement de données !
    Par Tr@nkill dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 05/04/2006, 12h36
  2. [Formulaires] Traitement des données dans une autre page...
    Par sekiryou dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/03/2006, 10h08
  3. [PHP-JS] Traitement des données dans une autre page...
    Par sekiryou dans le forum Langage
    Réponses: 5
    Dernier message: 04/03/2006, 10h06
  4. traitement des données avant envoie dans MySQL
    Par italiasky dans le forum SQL Procédural
    Réponses: 13
    Dernier message: 07/02/2006, 23h50
  5. Programmation pour traitement de données
    Par benbois dans le forum Langages de programmation
    Réponses: 16
    Dernier message: 19/10/2005, 18h01

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