OVH Cloud OVH Cloud

[VC++] CAsynchSocket : Probleme de reception

4 réponses
Avatar
Alex
Bonjour,

Je suis bloqué sur un petit probleme de réception de données avec la classe
ASycnhsocket. Mon programme est en mode client et ma routine de reception
ressemble à cela :

char buf[4096];

int nRead;

nRead = Receive (buf,4096); // Reception des données


Si le serveur envoie par exemple :

SALUT.SALUT2.\nSALUT3\n.SALUT4\n. (où '.' est 0x00)

ma routine reçoit dans le buffer de reception :

lors du 1ere appel : SALUT
lors du 2eme appel : SALUT3
lors du 3eme appel : SALUT4

Par contre le SALUT2 n'est pas recu :-(

Le probleme vient du fait qu'apres le premier SALUT, l'octet 0x00 semble
forcer la classe a considérer qu'il n'y a plus rien derrière, jusqu'au
prochain \n.

Peut-etre avez-vous une idée pour corriger le probleme ? Je vous remercie
d'avance.

A++

4 réponses

Avatar
Yalbrieux
Bonjour,

nRead = Receive (buf,4096); // Reception des données


Dans le silence des réponses,
je vous suggère de balayer votre buffer sur les nRead caractères et de
remplacer chaque 0x00 par un blanc par exemple.
N'oubliez pas de remettre à zéro tout votre buffer avant lecture.
Cordialement
Yves
Avatar
Alex
Bonjour et merci de votre aide,

J'ai modifié mon code afin de ne prendre en compte la réception que d'un
seul caractère par OnReceive. Je les sauvegarde en attendant que la
reception soit totale.

Ca fonctionne maintenant...

"Yalbrieux" a écrit dans le message de news:
43a5371b$0$19711$
Bonjour,

nRead = Receive (buf,4096); // Reception des données


Dans le silence des réponses,
je vous suggère de balayer votre buffer sur les nRead caractères et de
remplacer chaque 0x00 par un blanc par exemple.
N'oubliez pas de remettre à zéro tout votre buffer avant lecture.
Cordialement
Yves




Avatar
Dominique Vaufreydaz
Bonjour,

J'ai modifié mon code afin de ne prendre en compte la réception que
d'un seul caractère par OnReceive. Je les sauvegarde en attendant que
la reception soit totale.



Euh, c'est dangereux non ? C'est quoi l'interet ? Ce n'est pas parceque
tu ne vois (via un printf) que le mot n'est pas recu. LEs sockets travaillent
en binaire. Quel valeur de nombre d'octets recus as-tu en core retour
de Receive ?

Doms.
Avatar
Dominique Vaufreydaz
Re,

notons aussi que 4 send d'un cote, se se solde pas forcement par
4 receive de l'autre. TCP gere le regroupement de paquet !
Meme en local !

Doms.