C# HelloConnectMessage inexistant

Inscrit
2 Juin 2018
Messages
32
Reactions
0
#1
Bonsoir,

Je reviens cette fois-ci pour un problème plutôt étrange... Je ne comprend pas pourquoi mon programme ne m'affiche pas l'HelloConnectMessage (id 3) alors que d’après les logs officiel (fichier debug + F11) je l'ai bien Forward depuis mon programme ?

1557076352977.png


1557076483531.png

Dans les logs de mon programme je n'ai aucune erreur de parsing, ce qui plus surprenant c'est le fait que lorsque je parse le buffer puis que je réécris le paquet pour le renvoyer, une fois Send plus rien ne sa passe pourtant lorsque je compare le buffer reçu par le serveur officiel par exemple et le mien suite au parsing et à la réécriture chaque byte est identique ....
 
Inscrit
25 Novembre 2015
Messages
169
Reactions
20
#2
Cela n'a rien a voir avec le client dofus, c'est ton app qui dois avoir un probleme, et tu fournis aucun code qui plus est.
 
Inscrit
2 Juin 2018
Messages
32
Reactions
0
#3
Ici je reçois mes données :
C#:
 private async Task ReceiveLoopAsync(Socket sckReceiver, Action<byte[]> processMessage)
        {
            byte[] buffer = new byte[4096];
            int bytesRead;
            await Task.Run(async () =>
            {
                while (sckReceiver.IsConnected())
                {
                    Array.Clear(buffer, 0, buffer.Length);
                    bytesRead = await sckReceiver.ReceiveAsync(buffer, SocketFlags.None);
                    processMessage(buffer);
                }
                sckReceiver.Close();
            });
Ici je les analyses :
C#:
        public static bool TryParsePacket(byte[] message, int packetOriginEnum, out IPacket packet)
        {
            byte[] payload;
            DofusReader reader = default;
            packet = default;
           
            try
            {
                reader = new DofusReader(new MemoryStream(message));
                if (!TryParseHeader(ref reader, packetOriginEnum, out IHeader header))
                {
                    Console.WriteLine("header non complet !");
                    return false;
                }

                if(reader.BaseStream.Length < PacketHelper.GetExpectedPacketLength(header,packetOriginEnum))
                {
                    Console.WriteLine("payload non complet !");
                    return false;
                }

                payload = reader.ReadBytes(header.PacketLength);
                packet = new Packet(payload, header);
                return true;
            }
            finally
            {
                reader.Dispose();
            }
        }

        private static bool TryParseHeader(ref DofusReader reader, int packetOriginEnum, out IHeader header)
        {
            short metadata;
            int packetId;
            uint instanceId;
            LengthTypeEnum lengthType;
            byte[] dataLengthRead;
            int packetLength;
            header = default;

            if (reader.BytesAvailable < 2)
                return false;
            metadata = reader.ReadInt16();

            packetId = metadata >> BinaryConstants.BIT_RIGHT_SHIFT_LEN_PACKET_ID;
            lengthType = (LengthTypeEnum)(metadata & BinaryConstants.BIT_MASK);

            if (packetOriginEnum == 0 && reader.BytesAvailable < 4)
                return false;
            else
                instanceId = (packetOriginEnum == 0) ? reader.ReadUInt32() : 0;

            if (reader.BytesAvailable < (int)lengthType)
                return false;

            dataLengthRead = reader.ReadBytes((int)lengthType);
            packetLength = ParseDataLength(dataLengthRead, lengthType);

            header = new Header(packetId, lengthType, packetLength) { InstanceId = instanceId };
            return true;

        }

        private static int ParseDataLength(byte[] dataLengthReader, LengthTypeEnum lengthType)
        {
            int len = 0;

            for (int i = (int)lengthType - 1, j = 0; i >= 0; i--, j++)
                len |= dataLengthReader[j] << (i * 8);

            return len;
        }
Ensuite je les Forward :
C#:
 /// <summary>
        /// Process message from Client.
        /// </summary>
        /// <param name="buffer">Data received.</param>
        protected override void OnClientData(byte[] buffer)
        {
            if (!PacketParser.TryParsePacket(buffer, (int)PacketOriginEnum.Client, out IPacket packet))
                return;

            ForwardMessage(buffer, PacketDestinationEnum.Server, packet);
        }

        /// <summary>
        /// Process message from Server.
        /// </summary>
        /// <param name="buffer">Data received.</param>
        protected override void OnRemoteData(byte[] buffer)
        {
            if (!PacketParser.TryParsePacket(buffer, (int)PacketOriginEnum.Server, out IPacket packet))
                return;

            ForwardMessage(buffer, PacketDestinationEnum.Client, packet);
        }

Simple méthode qui send le buffer directement et affiche l'header du packet.

C#:
public void ForwardMessage(byte[] buffer, PacketDestinationEnum dst, IPacket packet)
        {
            string origin = dst == PacketDestinationEnum.Client ? "SERVER" : "CLIENT";

            if (dst == PacketDestinationEnum.Client)
                base.SocketClient.Send(buffer);
            else
                base.SocketClient.Send(buffer);

            Console.WriteLine($"[{packet.Header.ToString()}] forward from [{origin}]");
        }
Apres le message 5607 le client m'envoie un message visiblement nul :

1557152433297.png
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
Ou alors c'est un seul et même message sur deux paquets.
L'id 5607 n'est pas normal il me semble, tu n'aurais pas un problème de deserialize ?
 
Inscrit
25 Novembre 2015
Messages
169
Reactions
20
#5
Tu parse ta frame avec un if donc forcément il va parser que le premier paquet reçu dans la frame et n'afficher que celui-ci , et comme tu forward pas la frame mais le buffer complet le 2e message est quand même renvoyé au client, lis ton propre code ça aide :)

Il faut revoir ton implémentation socket, l'utilisation que tu fais de la TPL est mauvaise. (renseigne toi sur le CancellationTokenSource, la gestion des loop avec, et la gestion des erreurs)
 
Haut Bas