Du mal à lire les packets

Inscrit
10 Février 2020
Messages
18
Reactions
1
#1
Bonjour !
J'ai un gros problème de lecture des packets

Ce que je recoi dans ma console :
C#:
[6:13:13] [Game] Id: 226 | Count: 0 | Length: 322
[6:13:13] [Game] Id: 6440 | Count: 0 | Length: 13867
[6:13:13] [Game] Id: 0 | Count: 0 | Length: 0
[6:13:13] [Game] Id: 6237 | Count: 0 | Length: 0
[6:13:13] [Game] Id: 6492 | Count: 0 | Length: 24948
[6:13:13] [Game] Id: 11072 | Count: 0 | Length: 251
[6:13:13] [Game] Id: 144 | Count: 0 | Length: 13166217
[6:13:13] [Game] Id: 512 | Count: 0 | Length: 0
[6:13:13] [Game] Id: 0 | Count: 0 | Length: 0
[6:13:13] [Game] Id: 320 | Count: 0 | Length: 0
[6:13:13] [Game] Id: 64 | Count: 0 | Length: 1
[6:13:13] [Game] Id: 16063 | Count: 0 | Length: 196608
[6:13:14] [Local] Id: 6648 | Count: 675 | Length: 0
[6:13:14] [Game] Id: 176 | Count: 0 | Length: 0
[6:13:14] [Game] Id: 6649 | Count: 0 | Length: 38
[6:13:16] [Game] Id: 883 | Count: 0 | Length: 110
Certains arrivent à bien être décodés d'autres non comme vous pouvez le voir. Ce qui me donne des tailles & id délirantes. x)

Voici comment je décode les packets:
C#:
Message msg = new Message();
            BigEndianReader reader = new BigEndianReader(buffer);

            ushort header = reader.ReadUShort();
            int id = header >> 2;

            msg.Header = header;
            msg.Id = id;

            if (isClient)
                msg.Count = reader.ReadUInt();

            int length = 0;
            switch (header & 3)
            {
                case 1:
                    length = reader.ReadSByte();
                    break;
                case 2:
                    length = reader.ReadUShort();
                    break;
                case 3:
                    length = (reader.ReadByte() << 16) + (reader.ReadByte() << 8) + reader.ReadByte();
                    break;
            }

            msg.Length = length;

            byte[] data = (length > 0) ? reader.ReadBytes(length) : new byte[] { };
            msg.Data = data;

            return msg;
Si quelqu'un peut m'aider. ^^
 
Inscrit
3 Mai 2020
Messages
38
Reactions
13
#2
Ligne 10 si je comprends bien tu cherche à lire le GLOBAL_INSTANCE_ID or ce n'est pas ici qu'il se lit mais entre le lengthType et la length
 
Inscrit
10 Février 2020
Messages
18
Reactions
1
#3
Ligne 10 si je comprends bien tu cherche à lire le GLOBAL_INSTANCE_ID or ce n'est pas ici qu'il se lit mais entre le lengthType et la length
Ah bon tu es sur ? Pourtant j'obtiens pas d'erreur de ce côté là, le nombre que je reçois coïncide avec celui du client dofus...
 
Inscrit
3 Mai 2020
Messages
38
Reactions
13
#4
Ah oui tu as raison j'ai lu un peu trop en diagonale ton code. Est ce que tu as un système pour assembler/découper les paquets TCP en messages Dofus ?

Certains paquets TCP contiennent plusieurs messages Dofus, donc il faudra découper le paquet TCP. D'autres fois un seul message Dofus sera envoyé sur plusieurs paquets TCP, là il faudra recoller les morceaux
 
Inscrit
2 Juin 2020
Messages
57
Reactions
28
#5
Certains packets sont découpés et assure toi aussi de gérer les messages async, dans les sources du jeu c'est this._asyncNetworkDataContainerMessage = INetworkDataContainerMessage(msg) dans jera,,,,.network.ServerConnection.
 
Inscrit
10 Février 2020
Messages
18
Reactions
1
#6
Merci pour vos réponses !
Pour les packets "séparés" j'ai pas très bien compris. En gros quand le contenu du message est trop gros, une partie est envoyé sous le nom du message, les données restante dans un message "NetworkDataContainerMessage"

Pour gérer ces packets il faudrait pouvoir lier le message originel et NTDCM afin d'obtenir les deux parties qui composent le message. Mais comment procéder ? Est-ce qu'il y a un moyen d'identification du message originel dans NetworkDataContainerMessage ?

Merci.
 
Inscrit
26 Janvier 2016
Messages
79
Reactions
14
#7
En gros dans un packet TCP tu peux recevoir :
-Un message entier -> ras.
-Un message entier + un/plusieurs autre(s) -> tu dois lire la data de la bonne length , puis enchainer sur le(s) suivant(s).
-Un message non entier -> tu dois save la length et déduire la data de ta length sur tous les packet suivant jusqu'à complété ton message.
 
Dernière édition:
Inscrit
30 Octobre 2019
Messages
24
Reactions
13
#8
En gros dans un packet TCP tu peux recevoir :
-Un message entier -> ras
-Un message entier + un autre -> tu dois lire la data de la bonne length , puis enchainer sur l'autre message
-Un message non entier -> tu dois save la length et déduire la data de ta length sur tous les packet suivant jusqu'à complété ton message.
J'ajoute Un message entier + plusieurs autres, je m'en suis rendu compte hier soir
 
Inscrit
10 Février 2020
Messages
18
Reactions
1
#9
Ça a quand même l'air d'être compliqué. Mais bon je vais voir ça merci !
 
Inscrit
26 Janvier 2016
Messages
79
Reactions
14
#10
Ça a quand même l'air d'être compliqué. Mais bon je vais voir ça merci !
Bah vu la base que tu as ça devrait te prendre aux alentours de 10 lignes max , après c est pas la quantité qui fait la difficulté on est d'accord mais au vu de ce que tu as déjà réussis à faire c est pas dur du tout.

Si bien sur tu as fais ça tout seul ou à minima compris ce que faisait chaque ligne. ;)
 
Haut Bas