Bonjour à tous et à toutes
J'utilises les sockets et les packets fourni et il m'est impossible de les gérer correctement, car j'obtiens un gèle au niveau du receive en faisant pourtant un selector.wait() juste avant...
Voici ce qui se passe :
selector.wait() est dégelé, car le client envoie un packet. Ensuite, j'ai une condition qui appelle une fonction identification(client);
Voici juste le début et la fin de cette fonction :
bool ConnectionServer::identification(TcpSocket& client)
{
EncryptedPacket packet;
cout<<"1";
if(client.receive(packet) == Socket::Done)
cout<<"Packet recu";
else
{
cout<<"2";
return false;
}
}
T'es même chanceux Laurent, tu sais déjà ce qui se passe dans un EncryptedPacket
Bon, ce qui est intéressant dans ce code c'est simple : la console m'affiche : 12.
C'est pas normal, car les combinaisons possibles d'affichage devrait être "1packet recu" ou "12" en considérant que la fonction receive ne bloque pas étant donné qu'on est dans une boucle wait.
Ce qui arrive : quand le client se connecte et envoie son premier packet, le console affiche seulement le "1", ce qui veut dire qu'elle reste bloquée sur le receive. Ensuite, lorsque le client quitte, ça affiche le 2 (comme quoi qu'ya eu une erreur ou une déconnection).
Comment se fait-il que la fonction wait débloque (normal on envoie des données) et que la fonction receive reste bloquée alors que ya justement des données à lire !?
Sans compter que le client m'affiche lui dans sa console un Status Error (3 qui correspond à Error, testé en cout<<Socket::Error pour être sûr) lorsqu'il envoie son packet (cout<<socket.send(packet); donc), mais pourtant le serveur reçoit quelque chose puisque le wait rend la main sauf qu'après l'avoir rendu, la méthode receive bloque...
J'utilise peut-être pas correctement les sockets ? une erreur au niveau d'encryptedpacket c'est possible ?