Bonjour à tous et à toutes

Je crée un petit programme en C++ pour m'entrainer avec Qt, et je commence à utiliser QtNetwork.

J'ai un petit problème d'envois de paquet Udp du coté serveur de mon programme.


coté client : pas de problème pour envoyer
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
 
 
CClient::CClient() : QMainWindow()
{
                   // ..
 
                   M_PORT_UDP = 50888; // est un quint16
                   M_SERVER_UDP = new QUdpSocket(this);
                   M_SERVER_UDP->bind(QHostAddress::Any, M_PORT_UDP, QUdpSocket::ShareAddress);
 
                   // ..
}
 
 
// Cette fonction envoie en permanence des donnees toutes les 1500 ms
void CClient::refresh() 
{
                   QByteArray paquet;
                   QDataStream out(&paquet, QIODevice::WriteOnly);
 
                   QString messageAEnvoyer = "blabla";
 
                   out << messageAEnvoyer;
 
                   M_SERVER_UDP->writeDatagram(paquet, QHostAddress(M_HOSTNAME), M_PORT_UDP);  
}

Je veux simplement que le serveur, dés qu'il recoit un message, le renvoie a une liste de client
Pour cela, j ai fait comme ceci:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
 
CServer::CServer()
{
                   M_SERVER_PORT_UDP = 50888; // est un quint16
 
                   M_SERVER_UDP = new QUdpSocket(this);
                   M_SERVER_UDP->bind(QHostAddress::Any, M_SERVER_PORT_UDP, QUdpSocket::ShareAddress))
}
 
void CServer::dataReceived_udp()
{
          while (M_SERVER_UDP->hasPendingDatagrams()) 
          {
                    // lecture du paquet
                    QString message;
                    QByteArray datagram;
 
                    datagram.resize(M_SERVER_UDP->pendingDatagramSize());
                    QHostAddress sender;
                    quint16 senderPort;
 
                    M_SERVER_UDP->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
 
                    QDataStream in(&datagram, QIODevice::ReadOnly);
                    in >> message;
 
                    // le message est bel et bien recu et affichable
 
                    // si on recoit un message de deplacement, on le renvoi simplement a tout le monde
                    if (message == "blabla")
                    {
                              sendToAll_udp(message);
                    }
          }
}
 
void CServer::sendToAll_udp(const QString &message)
{
          // Préparation du paquet
          QByteArray paquet;
          QDataStream out(&paquet, QIODevice::WriteOnly);
          out << message; 
 
          for (int i = 0; i < M_LIST_USERS_CONNECTED.size(); i++)
          {
                    // M_LIST_USERS_CONNECTED est une QList de classes Clients que j ai créé moi meme.
                    QHostAddress Adresse = M_LIST_USERS_CONNECTED[i]->ip();
 
 
                    //C'est ici que se trouvent les problemes : J ai tenté, entre autre, ces 2 solutions
                    // mais les 2 me font crasher mon serveur :(
 
                    QUdpSocket udpSocket;
                    udpSocket.writeDatagram(paquet, Adresse, M_SERVER_PORT_UDP);  
                    // M_SERVER_UDP->writeDatagram(paquet, Adresse, M_SERVER_PORT_UDP);  
          }
}

Donc voila j'ai tenté de voir ou se trouvait exactement le problème en mettant des bouts de codes en commentaire par exemple. Le problème vient bel et bien des lignes 54,55 et 56 dans le code serveur... Je me demandait si le problème ne venait pas du fait que je test mes programmes en local, donc une fois que j'envoie un message depuis le serveur sur le port 50888, le serveur recoit lui meme le socket, doit le retraiter, le réenvoyer sur le port 50888, le retraiter etc. etc. en boucle infinie?

Comme je pense que c'est une possibilité d'erreur, je me demandait comment faire, vu que d'apres les sujets que j'ai lu pour résoudre mon problème il semble qu'il faut avoir le meme port d ecoute du coté serveur et du coté client.


Voila merci d'avance a ceux qui auront le courage de me lire

Bonne journée