Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Résolu] Valeur multiplié dans un packet  (Lu 2540 fois)

0 Membres et 1 Invité sur ce sujet

DipStax

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
[Résolu] Valeur multiplié dans un packet
« le: Août 22, 2019, 07:32:45 pm »
Bonjour,
J'utilise le systéme TCP de SFML et quand j'envoie un packet constitué:

/* Serveur: */
stuff stuff_;
packet << stuff_;
// puis un envoie tout ce qu'il a de plus conventionnel

// operateur:
sf::packet& operator<<(stuff& stuff_, sf::Packet& packet) {
   packet << stuff.getID() << stuff_.getName() << static_cast<int>(stuff_.getTypeObj())
             << stuff_.getMaxSlot() << static_cast<int>(stuff_.getPiece()) << stuff_.getMinLvl()
             << stuff_.getStat() << stuff_.getNbEnchant();
}
 

A partir de "static_cast<int>(stuff_.getPiece())", toute les valeurs sont multipliés par 65536.
Et la valeur de "stuff_.getNbEnchant()" est illisible.

/* Client: */
packet >> stuff;

// operateur:
sf::packet& operator>>(stuff& stuff_, sf::Packet& packet) {
  std::string name;
  int ID, typeObj, maxSlot, piece, minLvl, stat, nbEnchant;
  packet >> ID >> name >> typeObj >> maxSlot >> piece >> minLvl >> stat;
  if (!(packet >> nbEnchant))
        std::cout << "Fail: extract nbEnchant" << std::endl;
  std:: cout << ID << ":" << name << ":" << typeObj << ":" << maxSlot << ":" << piece << ":"
                 << minLvl << ":" << stat << ":" << nbEnchant << std::endl;
}
 

Ce qui me donne quand j'envoie des valeurs:

IDNameTypeObjmaxSlotpieceminLvlstatnbEnchant
1"none"123784envoie
1"none"12196608458752524288"Fail: extract nbEnchant"reception

Merci d'avance.
« Modifié: Août 23, 2019, 09:23:59 pm par DipStax »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Valeur multiplié dans un packet
« Réponse #1 le: Août 23, 2019, 06:37:40 am »
Le type int n'est pas approprié, comme indiqué dans le tutoriel il faut utiliser des types à taille fixe pour ne pas avoir de différences entre plateformes. Et éventuellement réduire la taille des données (ici tu pourrais utiliser uint8_t par exemple).

Essaye déjà ça et vois si ça change quelque chose.
Laurent Gomila - SFML developer

DipStax

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Problème résolut!
« Réponse #2 le: Août 23, 2019, 09:23:31 pm »
Merci, c'était bien les tailles variables de "int" qui posé probléme.