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 :
Bonne réception :Appuyez sur une touche pour continuer...
Connexion
0
Message envoye : #1Z1|
Message recu : 1Z1p+4s+100u+2o+175n+1000b+32282B+0d+0t+0W+1P+100N+0:b+1:B+0(61)
Statut : 0
Mauvaise réception :Appuyez sur une touche pour continuer...
Connexion
0
Message envoye : #1Z1|
Message recu : 1Z1p+4s (
Statut : 0
Message recu : 100u+2o+175n+1000b+32282B+0d+0t+0W+1P+100N+0:b+1:B+0 (53)
Statut : 0
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