Perte de messages

mohdaef Messages postés 68 Date d'inscription vendredi 23 novembre 2007 Statut Membre Dernière intervention 14 mars 2012 - 11 sept. 2009 à 19:32
cs_Scooper Messages postés 71 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 12 septembre 2013 - 15 déc. 2009 à 23:46
Bonjour à tous

Je suis entrain de programmer un petit multijoueur, et pour cela je doit échanger des messages entre les différents programmes.

Pour cela j'ai un pile qui accumule l'ensemble des messages à envoyer, ensuite j'un thread qui contien un boucle infinie qui prélève les messages dans la pile et les envois par le biais de la méthode send().

De l'autre côté c'est l'inverse j'ai un thread avec une boucle infinie qui récupére les messages par la méthode recv(), et qui les empiles dans la pile pour qu'il puissent être traités ultérieurement.

La première pile fonctionne correctement les message s'enregistre bien dans l'ordre et à la suite, le thread prélève et envoie les message sans erreurs (la méthode send() ne renvoie pas d'erreurs).
Le problème est que de l'autre côté la méthode recv ne récupère pas l'intégralité des messages.

J'ai utilisé la méthode Sleep() pour ralentir la fréquence d'envoie des messages et là tous les messages passent correctement.

A priorie je ne devrais pas avoir à utiliser d'appel à la méthode Sleep(). Pouvez-vous m'en dire plus sur ce comportement étrange ?

Un grand merci d'avance ça fait pas mal de temps que je suis dessus.

1 réponse

cs_Scooper Messages postés 71 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 12 septembre 2013
15 déc. 2009 à 23:46
Salut,

Je pense que tous tes messages arrivent de l'autre coté mais pas dans la forme ou tu le souhaites.

Je m'explique :

du coté serveur tu as une boucle qui envoie tes messages à la suite sous un format que tu as défini, (0xFF début et 0xAA fin du message) par exemple :
1er send
0xFF message1 0xAA
2ème send
0xFF message2 0xAA
...

et de l'autre coté, tu risque de recevoir plusieurs messages en seul flot de données :
1 seul receive :
0xFF message1 0xAA0xFF message2 0xAA0xFF message3 0xAA

regarde le contenu de ton buffer de réception ou avec Wireshark.

La solution est de faire une boucle qui parcourt les données que tu as reçu afin de toutes les traiter.

Sinon tu peux essayer l'option TCP_NODELAY qui permet de désactiver l'algorithme de Nagle mais tu utilisera plus de bande passante.
0
Rejoignez-nous