Réseau TCP avec Qt

Fermé
Flexy - 10 nov. 2012 à 19:04
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 12 nov. 2012 à 09:06
Bonjour,

Je travaille à un client TCP en C++ avec Qt. Comme ce n'est pas moi qui ferais le serveur je me suis fais un petit serveur temporaire pour voir comment il réagirait. Tout avait l'air de bien fonctionner jusqu'à ce que j'essaie d'utiliser la fonction qui envoi les données dans une boucle : le boucle s'effectue normalement mais le serveur ne reçoit que le premier paquet. Les autres, il les reçoit 1 par 1 à chaque fois que j'appelle ma fonction pour envoyer les données. Autrement dit, si j'utilise ma fonction dans une boucle for(int i=0; i<2; ++i){} il faut que je rappelle encore une fois ma fonction après pour qu'il reçoit le tout. Sauf ce que j'aurais voulu envoyé quand j'ai appelé ma hors d'un boucle. Mon serveur aura toujours un paquet de retard!

Voici mes fonctions :

CLIENT
void mainWindow::envoi(int id, int intensite, int temps)
{
QByteArray paquet;
QDataStream out(&paquet, QIODevice::WriteOnly);

out << (quint8) id;
out << (quint8) intensite;
out << (quint8) temps;

reseau->write(paquet);
}

SERVEUR
void fenetre::actionsRecues()
{
quint8 id = 0;
quint8 intensite = 0;
quint8 temps = 0;
// 1 : on reçoit un paquet (ou un sous-paquet) d'un des clients
// On détermine quel client envoie le message (recherche du QTcpSocket du client)
QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());

if (socket == 0) // Si par hasard on n'a pas trouvé le client à l'origine du signal, on arrête la méthode
return;

// Si tout va bien, on continue : on récupère le message
QDataStream in(socket);
if (id == 0) // Si on ne connaît pas encore l'id, on essaie de la récupérer
{
if (socket->bytesAvailable() < (int)sizeof(quint8)) // On n'a pas reçu l'id en entier
return;
in >> id; // Si on a reçu l'id en entier, on la récupère
}
//on fait de meme pour les autres parametres
if (intensite == 0)
{
if (socket->bytesAvailable() < (int)sizeof(quint8))
return;
in >> intensite;
}

if (temps == 0)
{
if (socket->bytesAvailable() < (int)sizeof(quint8))
return;
in >> temps;
}


// 2 : execution de l'action
QString action;
action = "\nLa lampe " + QString().setNum(id) + " prend l'intensite " + QString().setNum(intensite) + " en " + QString().setNum(temps) + " temps.";

executer(action);
}


void fenetre::executer(const QString &action)
{
ui->actions->append(action);
}


2 réponses

La taille de mon message est toujours de 3 octets puisqu'il est composé de 3 quint8
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
12 nov. 2012 à 09:06
Salut.
cela resemble à un problème de tampon. Je n'ai pas vu de flush dans la doc.
Essai d'envoyer "\r\n" à la fin de ton message pour forcer l'envoi de données.
0