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 :

CSocket qui saute au bout de quelques réceptions


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 2
    Par défaut CSocket qui saute au bout de quelques réceptions
    Bonjour,

    Tout d'abord merci d'avance à tous ceux qui prendront la peine de me lire et de me répondre.

    Si jamais cette question a déjà été posé au sein du forum, vraiment désolé mais je ne l'ai pas repéré. J'ai un peu fouillé et trouvé des tas de réponses autour du sujet qui m'occupe mais jamais la bonne soluce (j'ai trouvé un post très proche de mon problème mais il n'y avait pas de réponse).

    J'essaye d'utiliser les CSocket (couplés aux CArchive) pour faire un programme client et un autre serveur s'échangeant des objets grâce à la sérialisation. Je me suis bien renseigné et ai pompé les jolis codes qui font bien et pour l'instant ça marche ... du moins au début.

    J'instancie les CSocket, je Connect, j'Accept et ensuite je Serialize mes objets dans un sens puis dans l'autre sens. Tout ça marche bien.

    Le truc, c'est que j'envoie un bon paquet de données (un peu plus de 150 int et quelques CString) chaque seconde. Et qu'au bout de 150 - 250 envois (variable selon le moment et selon les pcs ... sur un autre ordi, ça saute au bout de 10 - 15 envois), le socket de réception coince (OnReceive n'est plus appelé), ce qui doit provoquer la saturation du buffer du CFileSocket (le truc qui est entre le CSocket et le CArchive) car le socket d'envoi coince lui aussi mais après une dizaine d'envoi de plus.

    Tout ceci m'embête beaucoup car j'aimerais pouvoir tenir plus longtemps.

    J'ai trouvé sur le site de Microsoft un article traitant de ce problème (http://support.microsoft.com/kb/245434/fr) et offrant une solution (overrider la méthode DoCallBack de CAsyncSocket à partir du stdafx.cpp).

    Je sais pas trop ce qui se passe mal (j'ai cru comprendre que cela avait un rapport avec les envois de message FK_READ) mais en tous cas cette modif semble corriger le problème (je l'ai pas poussé à fond mais j'ai dépassé tous mes records d'envois - réception) ... Le problème est que cette modification a transformé ma méthode OnReceive en méthode bloquante.

    Chaque appel à OnReceive attend l'envoi suivant pour finir de s'exécuter (ça j'en suis sûr, j'ai vérifié en espaçant mes envois), ce qui est très pénible car pendant ce temps l'appli est bloqué (plus moyen de cliquer sur un bouton). J'ai fouillé un peu et je me suis rendu compte qu'elle est bloqué au premier appel du CArchive de sortie (*m_pArchiveIn >> truc) et qu'elle attend l'envoi suivant pour enfin lire cette donnée et continuer la séquence.

    Pour pallier à ce problème, j'ai essayé de coller le traitement de OnReceive dans un thread mais cela provoque l'ire du CSocket (j'ai cru lire quelque part que les CSockets étaient très tatillons au niveau des threads). J'ai ensuite rajouté un SendMessage à partir du thread, mais j'en suis revenu au problème d'avant : l'appli se bloque (ce qui est semble-t-il normal car je suis revenu au thread principal qui gère les événements de l'appli, du moins c'est ce que je me dis).

    Voilà où j'en suis actuellement.

    J'entrevois plusieurs solutions :
    - y a une solution évidente que je n'ai pas vu et que je n'ai pas trouvé sur internet ... je me baffe, me mets des claques et ne vous embête plus.
    - j'arrive à exécuter mon OnReceive (et le serialize qui va avec) dans un thread autre que celui de l'appli (ma réception sera décalé de 1 tic mais ce n'est pas si grave que ça). Est il possible de créer un deuxième thread capable d'exécuter les ON_MESSAGE ? Ou bien y a t il un moyen de faire en sorte que les CSocket acceptent d'exécuter leurs méthodes dans un bête CWinThread ?
    - j'arrive à faire en sorte que le OnReceive ne se bloque plus bêtement sur le premier >> en attendant l'envoi suivant (je jure que je fais bien un Flush() de l'autre coté). Je ne vois pas pourquoi ça me fait ça maintenant alors qu'avant non.
    - je dégage le bout de code de correction de stdafx.cpp et je corrige mon problème de stabilité autrement.
    - je me mets les CSockets là où je pense et je passe à autre chose ... pas très envie car le coup de la serialisation avec les CArchive pour transbahuter des infos sur le net avait l'air vachement bien.
    - les extraterrestres débarquent, font sauter la planète et mes problèmes avec ... désolé ...

    Si quelqu'un veut m'aider, je suis tout à fait près à envoyer des bouts de code, histoire d'expliquer un peu mieux mes soucis.

    J'espère ne pas avoir été trop indigeste et que vous aurez réussi à me comprendre malgré le manque d'exemple de code ... et que la solution à mon problème existe sur cette terre ...

    Merci d'avance

  2. #2
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    Citation Envoyé par Deckard666
    - j'arrive à exécuter mon OnReceive (et le serialize qui va avec) dans un thread autre que celui de l'appli (ma réception sera décalé de 1 tic mais ce n'est pas si grave que ça). Est il possible de créer un deuxième thread capable d'exécuter les ON_MESSAGE ? Ou bien y a t il un moyen de faire en sorte que les CSocket acceptent d'exécuter leurs méthodes dans un bête CWinThread ?
    Option A: je trouve que ce chemin reste le meilleur a exploiter. Je suis deja arriver a faire des Soket au niveau d'un CWinthread mais j utilisait pas l'API MFC pour les Socket...

    Citation Envoyé par Deckard666
    - les extraterrestres débarquent, font sauter la planète et mes problèmes avec ... désolé ...
    Ca c'est l option B... au cas ou la A marche pas.

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 2
    Par défaut
    Merci Zaan pour ta réponse mais j'ai trouvé une autre solution : je force un OnReceive (via un SendMessage qui appelle une méthode publique de mon CSocket) dès que je sens que le CSocket se coince.

    Je suis donc revenu à la situation initiale (sans correction de la classe CAsyncSocket) et j'ai rajouté un CWinThread qui vérifie toutes les secondes un time out sur le OnReceive. Si le time out excède une seconde, je force le OnReceive (avant je fais un CancelBlockingCall dès fois que) et c'est reparti (aussi étrange que cela puisse paraître, il arrive à retrouver ses petits et à attraper les appels suivants).

    ça semble pas mal et pour l'instant ça marche. Espérons que cela reste comme ça.

    Merci pour tout et à + (par contre je sais pas mettre le [RESOLU] sur l'intitulé du fil)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Msgbox qui disparaitrait au bout de quelque secondes.
    Par jolzeviking dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/07/2008, 21h07
  2. Réponses: 3
    Dernier message: 21/04/2006, 12h15
  3. Musique qui saute.
    Par Satch dans le forum Périphériques
    Réponses: 2
    Dernier message: 30/03/2006, 14h04
  4. update qui bloque au bout d'un certain temps
    Par delaio dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/03/2006, 09h51
  5. [TOMCAT] Tomcat ne répond pas au bout de quelques jours
    Par Bartuk dans le forum Tomcat et TomEE
    Réponses: 7
    Dernier message: 02/03/2006, 17h38

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