Bonjour,
J'utilise le module réseau de Qt pour communiquer entre deux machines. L'une est un serveur gérant de multiples connexions en utilisant les signaux et slots.
L'autre est un client utilisant une bibliothèque d'affichage temps réel 3D. Dans ce client, je ne peux donc pas utiliser de signaux et slots car je gère moi même la boucle de raffraichissement de l'affichage 3D.
J'ai cependant quelques questions vis-à-vis de la "bonne manière" dont je dois utiliser les classes de Qt du réseau.
Déja pour la connexion, j'aimerai savoir comment je dois vérifier que la connexion a bien été établie. Car j'ai fait quelques tests et du coté serveur, j'obtiens un message indiquant que la connexion est effective, mais du coté client, je vérifie dans a chaque itération dans la boucle principale si le status de la connexion a changé, et j'ai remarqué que le status reste en mode "ConnectingState". Lorsque j'utilise la fonction waitForConnected, alors le status passe effectivement en mode "ConnectedState", mais je ne souhaite pas utiliser de fonctions bloquantes dans mon application client.
Par contre, le probleme le plus embetant est que dans un cas comme dans l'autre, je ne peux recevoir de données du réseau, même lors de l'envoie de données, bytesAvalaible reste à 0.
Je précise pour les septiques que j'ai créé un client alternatif de test qui utilise les signaux et slots et que j'arrive parfaitement à communiquer avec celui-ci. je n'ai donc aucuns problèmes du coté du serveur.
Ai-je oublié quelque chose ?
Voila le code que j'ai testé (il n'est pas tres propre mais c'est un code de test):
Dans la fonction de connexion:
Dans la boucle principale:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 mServerSocket->abort(); mServerSocket->connectToHost(ip, port); mServerSocket->waitForConnected(1000);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 // Verify connexion status static QAbstractSocket::SocketState currentSocketState = QAbstractSocket::UnconnectedState; QAbstractSocket::SocketState lastSocketState = currentSocketState; currentSocketState = serveur->state(); if (mConnected) { if (currentSocketState == QAbstractSocket::UnconnectedState) { appendTextToLog("Déconnecté"); deconnected(); } else if (mServerSocket->isValid()) { static int currentBytesAvailable = 0; int lastBytesAvailable = currentBytesAvailable; currentBytesAvailable = mServerSocket->bytesAvailable(); if (currentBytesAvailable != lastBytesAvailable && currentBytesAvailable > 0) receivedData(); } } else { if (currentSocketState != lastSocketState) { switch(currentSocketState) { case QAbstractSocket::UnconnectedState: appendTextToLog("Deconnecté"); deconnected(); break; case QAbstractSocket::ConnectedState: appendTextToLog("Connecté"); connected(); break; case QAbstractSocket::ConnectingState: appendTextToLog("Connexion..."); break; } } }
Partager