C/C++ [C++] Problème de récéption de paquets

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#1
Bonjour,

Je bloque complet en ce moment. Cela semble etre un problème tout con! Je vous explique, le paquet 6440 est beaucoup trop long (11820 bytes et quelques) et il semblerait qu'il soit envoyé par dofus en morceaux de 1368 bytes exactement. De ce fait mon programme par dans une boucle infinie folle que je n'arrive pas a fixer, voici ma fonction:

Code:
const QList<MessageInfos> Buffer::readPacket(const QByteArray &packetData)
{
    QList<MessageInfos> dataInfos;
    static bool bug = false;
    static int size = 0;

    qDebug()<<"-----------PACKET(S) RECU ("<<packetData.size()<<")----------";

    while (messageTotalLength < packetData.size())
    {
    int messageLength = 0;
    ushort hiheader = MessageReader(packetData.mid(messageTotalLength,2)).readUShort();
    ushort packetID = hiheader >> 2;
    ushort lenghtType = hiheader & 3;

    MessageReader reader(packetData.mid(2+messageTotalLength,3).data());

    if (lenghtType == 1)
        messageLength =  reader.readByte();

    else if (lenghtType == 2)
        messageLength =  reader.readUShort();

    else if (lenghtType == 3)
        messageLength = reader.readUInt();

    MessageInfos infos;
    infos.messageId = packetID;


    else
        infos.messageData = packetData.mid(2+lenghtType+messageTotalLength, messageLength);


    dataInfos<<infos;
    messageTotalLength+=messageLength+2+lenghtType;

    qDebug()<<"Packet "<<dataInfos.size()<<"-  PacketID : "<<packetID<<
              "  Message's Length : "<<messageLength<<
              "  LengType : " <<lenghtType;

    qDebug()<<" ";
    }
    }

    return dataInfos;
}

Merci d'avance pour votre aide, j'attends vos réponses!

PS: J'utilise Qt.
 
A

Anonymous

Invité
#2
Cette méthode de réception ne tiens aucunement compte du nombre d'octets disponibles dans le buffer de réception.

Tu dois absolument faire des vérifications sur la taille des données, ta méthode n'est autrement pas correcte du tout :

1) si taille dispo > 2 -> lire header, sinon attendre
2) si taille dispo > taille de la taille -> lire la taille, sinon attendre
3) si taille dispo > taille données lues à l'étape 2 -> lire les données, sinon attendre

Ce qui se passe ici c'est que la taille des données est supérieure à la taille des données reçues, donc tu ne peux pas reconstituer le message dans son intégrité. Il te faut absolument attendre d'avoir toutes les données disponibles.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#3
Bonjour , les morceaux de 1368 bytes ca me parrait tres peu meme si ca a rien a voir avec ton probleme (que Munrek a bien cerné) , tu as pas une limite dans la routine de reception ?
(de toute facon ca sera quand meme sur plusieurs receptions mais bcp moins si tu recois des morceaux plus gros)
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#4
Non je pense que c'est dofus qui envoie par paquets de 1368 Max car quand je sniff
avec wireshark quand je me co avec le vrai client j'observe bien des paquets de 1368

Sinon merci de ta réponse munerk je vais tester ce soir
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#5
Bonjour,

Bon ca à l'aire de marcher mais il semble que je doive envoyer le paquet 5607, le ClientKeyMessage, qui requiert que
j'envoie une clef au format UTF sauf que je ne comprends pas ce que c'est cette clef.

Merci d'avance pour vos réponses!
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#6
C'est une key généré par le client, la je suis en déplacement, je peux pas t'en dire plus. Mais il me semble que dans Overedge il y a la classe ClientKey, et il me semble aussi que c'est une classe a traduire dans les sources de dofus.
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#7
Ok merci pour vos réponses,
J'en profite pour vous demander le numéro/nom du paquet qui contient les infos sur la map svp
car je ne le trouve pas merci!
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#8
Id: 226
Nom: MapComplementaryInformationDataMessage

Je ne suis pas sur pour le nom, peut être une faute d'hortographe.
 
Haut Bas