[C++] Problème avec Qt : QDataStream

pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 - 30 août 2010 à 21:25
pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 - 1 sept. 2010 à 11:59
Bonjour a tous, j'ai un petit souci, je m'entraine à faire une petite application réseau, et à un moment mon serveur doit renvoyer des données dans un paquet de type QByteArray que je remplis à l'aide d'un QDataStream.
Voila le code :


			
//Je crée les variables
QString reponse = "Prêt";
QByteArray paquet;
QDataStream sortant (&paquet, QIODevice::WriteOnly);

//Je rentre un nombre qui stocke la taille du paquet, et la réponse :

sortant << (quint16) 0;
sortant << reponse;

// Je me replace au début et recalcule la taille qui vient remplacer le précédent nombre : 

sortant.device()->seek(0);
sortant << (quint16) (paquet.size() - sizeof(quint16)); 

//Et puis j'envoie le paquet
socket->write (paquet);


Mon problème est que le QDataStream est vide; le client ne reçoit rien.
D'ailleurs à la suite de ce code j'ai tenté de mettre :

	QString message;
quint16 taille;
sortant >> taille >> message;
QMessageBox::information (this, "message vaut : " , message);	



Ce qui me confirme que "sortant" est vide. Pourquoi ? Je ne trouve pas mon erreur.

Merci de votre aide.


Pop70

5 réponses

pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 10
31 août 2010 à 09:59
J'ai rechercher plus minutieusement, et il s'avère que ça bloque dans le client quand il reçoit la réponse du serveur :
D'ailleurs, je pense que le QDataStream du serveur n'était pas vide, j'ai juste oublié qu'il était en WriteOnly (ce qui expliquerais que je ne puisse pas le lire)

QMessageBox::information (this, "Client", "Client recoit réponse");
QDataStream rentrant (wSocket);

if (wTailleMessage == 0)
{
if (wSocket->bytesAvailable() < (int)sizeof(quint16))
return;

rentrant >> wTailleMessage;
}
if (wSocket->bytesAvailable() < wTailleMessage){
// Bloque ici : Le messagebox ci-dessous s'affiche
QMessageBox::warning (this, "ClientErreur", "Erreur");
//return; J'ai enlevé le return pour voir ce que donnait le message
}
QString message;
rentrant >> message; 
QMessageBox::warning (this, "ClientErreur", message); // et le message est vide
wTailleMessage = 0;

if (message == "Prêt")
Fonction();


Voila, si quelqu'un sait où est l'erreur...Merci d'avance


Pop70
0
shorzy Messages postés 94 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 1 juin 2013
31 août 2010 à 10:47
Salut.

Tu ne peux pas faire :

QDataStream rentrant (wSocket);
QString message;
rentrant >> message;


Tu peux le Faire avec :
QTextStream rentrant (wSocket);
QString message;
rentrant >> message;

Si tu veux absolument un QDataStream
Il faut faire une Bidouille...



Yeeh Baby
0
shorzy Messages postés 94 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 1 juin 2013
31 août 2010 à 12:42
Tiens ?? Non !! C'est Bon avec un QDataStream
Il ont du Changer ça d'une Version à l'Autre !!!


Je ne connais pas les Sockets, mais ...

Je crois suivant ton 1er Post que wSocket correspond à l'Objet paquet
Paquet est un QByteArray :
Donc l'Erreur se siturait là :
QDataStream rentrant (wSocket);

Remplace la Ligne par :
QDataStream rentrant (wSocket, QIODevice::OpenMode ReadWrite)


[i]Ps:
N'oublie pas d'Initialiser le Flux./i
0
pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 10
31 août 2010 à 13:32
Merci de votre aide, mais la console n'accèpte pas QDataStream rentrant (wSocket, QIODevice::OpenMode ReadWrite), elle dit qu'il ne peut y avoir qu'un argument.

C'est quand même bizarre, car le programme est un chat genre msn en plus petit, et le principe de ce bout de code est d'inscrire un client qui envoie son pseudo, le serveur vérifie la disponibilité de ce pseudo (fonction qui n'est pas encore écrite), ensuite il renvoi si c'est bon ou pas (ici je met que c'est bon par défaut puisque qu'il ne vérifie pas encore), puis le client envoi le reste des informations.

Ce qui est étrange c'est que le code est presque similaire que celui dans la partie chat ou j'écris :

	QDataStream rentrant (wSocket);
if (wTailleMessage == 0)
{
if (wSocket->bytesAvailable() < (int)sizeof(quint16))
return;

rentrant >> wTailleMessage;
}
if (wSocket->bytesAvailable() < wTailleMessage)
return;

QString messageRecu;
rentrant >> messageRecu;

for (int i = 0; i < wVDialogue.size();i++)
{
wVDialogue.at(i)->AjoutTexte ("
" + messageRecu);
}


dans la fonction de réception du client, et ça marche parfaitement.

Ici, le problème est que le serveur dit envoyer les données, le client dit les recevoir et pourtant il ne reçoit rien hormis peut-être la taille du paquet qui vraisemblablement n'est plus bonne puisque le message est vide...


Pop70
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 10
1 sept. 2010 à 11:59
Petite rectification, après avoir réessayer la partie chat, je me suis apercu que seul le premier message partait, le problème était du au manque de wTailleMessage = 0 à la fin de la fonction.
Je pense que le problème est dû à cette même erreur dans le cas présent sauf que wTailleMessage = 0 est bien écrit...


Pop70
0
Rejoignez-nous