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

Auteur Sujet: Réception de données non complètes : Comment contrôler ?  (Lu 3538 fois)

0 Membres et 1 Invité sur ce sujet

VinceLaTaupe

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
Réception de données non complètes : Comment contrôler ?
« le: Juillet 11, 2017, 01:24:04 pm »
Bonjour à tous.

J'ai un problème dont je n'arrive pas à identifier tout à fais la cause. Avant tout je précise que je ne peux pas utiliser la classe sf::Packet, car je ne gère pas le "coté serveur".

Je suis censé recevoir un message générique d'une 60aine d'octets.

Du coup je me suis créé un buffer de taille 64. Le problème est qu'au moment de la réception je ne reçois pas les 61octets, du moins pas tout le temps et c'est ça que je comprends pas...
Parfois je reçois l'intégralité du message, parfois non.

Le problème, c'est que lorsque je ne reçois pas l'intégralité de mon message, le statut renvoyé est quand même sf::Socket::Done, du coup, aucun moyen pour moi d'analyser si mon message est complet ou non pour refaire appel à la fonction receive() ...

Je précise que je ne peux pas travailler avec sf::Packet car je ne controle pas le serveur.

Voici mon code "abrégé" et les réponses associées :

int main()
{
        sf::TcpSocket socket;
        std::cout << "Connexion" << std::endl;
       
        sf::Socket::Status status = socket.connect("192.168.127.254", 9001);
        std::cout << status << std::endl;

        size_t received(1);
        char data[64] = { 0 };
        std::string str{ "" };

        str =  "#1Z1|\r" ;

        if (socket.send(&str[0], str.size()) != sf::Socket::Done)
                std::cout << "Erreur envoi" << std::endl;
        else
                std::cout << "Message envoye : " << str << std::endl;

        status = socket.receive(data, 64, received);

        if ( status != sf::Socket::Done)
                std::cout << "erreur reception. Statut : " << status << std::endl; // La c'est juste pour illustrer si le message n'est pas reçu en intégralité.
        else
        {
                data[received - 1] = '\0';
                str = data;
                std::cout << "Message recu : " << str << " (" << received << ")" << std::endl;
                std::cout << "Statut : " << status << std::endl;
        }

        // Pour Prouver qu'il en reste éventuellement :
        if (received != 61)
        {
                status = socket.receive(data, 64, received);

                if (status != sf::Socket::Done)
                        std::cout << "erreur reception. Statut : " << status << std::endl; // La c'est juste pour illustrer si le message n'est pas reçu en intégralité.
                else
                {
                        data[received - 1] = '\0';
                        str = data;
                        std::cout << "Message recu : " << str << " (" << received << ")" << std::endl;
                        std::cout << "Statut : " << status << std::endl;
                }
        }
}
 


Du coup quand tout se passe bien, j'ai mis en PJ une capture du résultat et de même quand ça marche pas bien...

Et voilà le résultat par écrit :
(click to show/hide)


Le statut 0 correspond à sf::Socket::Done.

On voit bien ainsi que parfois je ne reçois pas tout, et pourtant le programme me renvoie un statut "Done" ...

Une idée du problème et de comment le régler ?

Merci d'avance.
Vincent.

PS : Je suis débutant, ne m'en voulez pas trop si j'ai fais des fautes graves svp :p

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Réception de données non complètes : Comment contrôler ?
« Réponse #1 le: Juillet 11, 2017, 02:22:05 pm »
Pas la peine d'écrire ton message sur les deux forums, il y a beaucoup plus de fréquentation sur le forum anglais, tu peux te contenter de poster là-bas ;)

Pour ceux qui voudraient répondre :
https://en.sfml-dev.org/forums/index.php?topic=22239.0
Laurent Gomila - SFML developer

VinceLaTaupe

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
Re: Réception de données non complètes : Comment contrôler ?
« Réponse #2 le: Juillet 11, 2017, 02:28:09 pm »
Héhé, j'étais pas sûr de ça, du coup dans le doute ...
Après c'est toujours plus simple d'expliquer et comprendre dans une langue natale ;)