Résolu NodeJs | Erreur parse payload (TCP)

MaSTeR

Contributeur
Inscrit
20 Septembre 2016
Messages
32
Reactions
11
#1
Bonjour à tous,

Comme vous le savez dans le cadre du projet Elk (émulateur dofus touch), j'ai dû mettre en place un Proxy NodeJs.

Son fonctionnement est simple : Client (1,N)<---> (1,N) Proxy (1) <----> (1) Serveur D2

Le proxy tourne sous Primus (engine.io comme transport et websocket comme transformer) [https://github.com/primus/primus]

Pour faire simple comme vous le voyez, le proxy discute via un single-thread avec le serveur d2 et passe toutes les informations des clients par ce thread. Pour identifier un client j'utilise un custom header qui contient (ClientId<20 bytes>|TrameSize<4 bytes>). De mon côté je lis le flux en continu et parse les données sans souci.

Je précise ici que c'est Primus qui gère les clients, celui-ci génére un ssid par connexion ws afin d'assurer l'unicité du client. Le single-thread est nécessaire, sinon je ne peux pas assurer l'ordre de l'envoi et de la réception.

Seulement voilà, lorsque je fais des tests - je simule 500 connexions sur le serveur (auth -> world -> puis déplacement sur la map) il arrive parfois que le proxy parse mal les données, je m'explique.

Voilà le code Reader du Proxy (utilisé lorsque celui-ci reçoit les données du serveur D2) :

https://pastebin.com/Tk2wGqtJ

Cependant, il arrive parfois sans raison (du moins que je connaisse) que le Reader parse mal le JSON et en fait, je ne sais pas comment l'expliquer mais je me retrouve avec 2 trames imbriquées les unes dans les autres. Le code JSON devient illisible car j'ai le payload de la 1ere trame et une trame pleine (header + payload) dans celle-ci.

Ça arrive uniquement lorsque la proxy se fait flood massivement (ici 500 connexions) et environ 25 trames par connexion, sinon 0 souci. Est-ce un souci lié à mon single-thread ? Car je précise que le serveur D2 envoi bien la trame pleine sans souci, car je n'ai aucune erreur de sérialisation du JSON. Les données sont envoyées et flush.

Si quelqu'un peut m'épauler ça serait super, peut-être une erreur de structure ou que sais-je.

Merci
 
Dernière édition:

MaSTeR

Contributeur
Inscrit
20 Septembre 2016
Messages
32
Reactions
11
#2
J'ai fix, souci de lecture de trame pleine, je vérifiais que le buffer avait au minimum la taille du payload et non la taille de trame pleine (header + payload length).

Arrivé à certain point, les trames se coupent (65 536 bytes) et la lecture se décale.

Voilà voilà
 
Haut Bas