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

Auteur Sujet: Impossible d'extraire un char d'un paquet  (Lu 2933 fois)

0 Membres et 2 Invités sur ce sujet

DexArio

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Impossible d'extraire un char d'un paquet
« le: Février 13, 2015, 02:25:55 pm »
Bonjour,

J'essaye de transmettre des fichiers avec TCP et je dois donc envoyer des char. Cependant, je n'arrive pas à les extraire.

Voici la fonction qui injecte un fichier dans un paquet (elle sera utilisée côté serveur, je n'ai pas pu la tester étant donné que mon problème fait que mon programme ne compile pas):

bool NetworkManager::AddFileToPacket(sf::Packet &p, string path)
{
   //Sources -> http://www.cplusplus.com/reference/cstdio/fread/ & http://en.sfml-dev.org/forums/index.php?topic=4709.0
   FILE *pFile;
   long size;


   pFile = fopen(path.c_str(), "rb");
   if (pFile == NULL)
   {
      fputs("File error", stderr);
      return false;
   }


   //Obtaining file size
   fseek(pFile, 0, SEEK_END);
   size = ftell(pFile);
   rewind(pFile);


   //Copying the file into the buffer
   vector<char> buffer;
   for (int i = 0; i < size; i++)
   {
      char* ch;
      fread(ch, 1, 1, pFile);
      buffer.push_back(*ch);


      delete ch;
      ch = 0;
   }


   //Injecting the vector into the packet
   p << static_cast<sf::Uint32>(buffer.size());
   for (vector<char>::const_iterator it = buffer.begin(); it != buffer.end(); it++)
   {
      p << *it;
   }


   //Closing the file
   fclose(pFile);


   return true;
}
 


Côté client, je dois extraire tout ça sauf que je ne peux pas extraire les chars:

//Extracting the vector from the packet
sf::Uint32 size;
p >> size;


vector<char> buffer;
for (sf::Uint32 i = 0; i < size; i++)
{
    char item;
    p >> item; //Error: no operator matches these operands. operand types are: sf::Packet >> char
    buffer.push_back(item);
}
NetworkManager::Instance().ReconstructFileFromBuffer(buffer, "data/file.txt");
 

Comme marqué dans les commentaires, l'erreur est la suivante: Error: no operator matches these operands. operand types are: sf::Packet >> char.

Je trouve cela bizarre qu'il soit possible d'injecter un char mais pas de l'extraire.

Merci.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Impossible d'extraire un char d'un paquet
« Réponse #1 le: Février 13, 2015, 02:39:26 pm »
Plusieurs choses :

1. Utilise du code C++ plutôt que du code C pour lire ton fichier (std::ifstream). Et accessoirement, ça peut se faire en 3 lignes au lieu de ce gros tas de code ;)

2. Utilise Packet::append et Packet::getData/getDataSize au lieu de gérer ton buffer octet par octet !

3. Ce comportement n'est pas bizarre : côté envoi, l'opérateur << prend une copie de T, donc les conversions implicites fonctionnent et ton char n'a aucun mal à être converti en un type compatible (sf::Int8 normalement). Par contre côté réception, l'opérateur >> prend en paramètre une référence, donc il faut que le type colle exactement ; et bien entendu il n'y a pas de surcharge pour char, uniquement pour les types à taille fixe (justement pour décourager les utilisateurs de faire des choses potentiellement dangereuses...).
Laurent Gomila - SFML developer

DexArio

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re : Impossible d'extraire un char d'un paquet
« Réponse #2 le: Février 13, 2015, 03:05:12 pm »
Est-ce que ça vous dérangerai de m'éclaircir un peu sur le 1., quelles sont les fonctions à utiliser ? si j'ai bien compris ce que vous me dites, il y a une façon de mettre le fichier directement dans le paquet et pas octet par octet.

Merci.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Impossible d'extraire un char d'un paquet
« Réponse #3 le: Février 13, 2015, 04:31:10 pm »
Citer
Est-ce que ça vous dérangerai de m'éclaircir un peu sur le 1., quelles sont les fonctions à utiliser ?
Je pense que Google a plus de résultats que nécessaires avec (au hasard) "ifstream c++ read file". Mais bon.

std::ifstream file(path, std::ios_base::binary);
std::vector<char> buffer(std::istreambuf_iterator<char>(file), (std::istreambuf_iterator<char>()));

Citer
si j'ai bien compris ce que vous me dites, il y a une façon de mettre le fichier directement dans le paquet et pas octet par octet.
Oui, et je t'ai même donné le nom des fonctions à utiliser donc là je ne vais pas te donner le code tout cru... ;)
Laurent Gomila - SFML developer

DexArio

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re : Impossible d'extraire un char d'un paquet
« Réponse #4 le: Février 14, 2015, 12:51:49 am »
Je dois avouer que j'ai été un peu fainéant sur ma dernière réponse, je m'en excuse, je vais aller faire mes recherches, merci pour tout !