Réseau TCP avec Qt
Flexy
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
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);
}
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);
}
A voir également:
- Réseau TCP avec Qt
- Tcp udp - Guide
- Tcp optimizer - Télécharger - Optimisation
- Entrer les informations d'identification reseau - Guide
- Le message n'a pas été envoyé car le service n'est pas activé sur le réseau - Forum Xiaomi
- Tcp view - Télécharger - Divers Réseau & Wi-Fi