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
Partager