Bonjour,

Je fais appel a vous tous pour m'aider a trouver une façon clair et rapide pour établir une connexion, recevoir des paquet et réagir en conséquence.

Le fait est que plusieurs paquets peuvent êtres envoyés d'un coup, et qu'il n'y a pas moyen de savoir combien de paquets vont arriver exactement.


En ce qui me concerne j'ai essayé 2 méthodes, chacune est parvenue a une échec :

La première était de créer une boucle qui recevrait les paquet et les traiterait directement.

Comme rien ne vaut un exemple simple :

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
 
While(connected)
{
    // réception des données avec recv()
    // Vérification du paquet 
    switch(type de paquet)
    {
          case paquet1 :
                // On réagit en conséquence
                // On envoie éventuellement une réponse, si réponse 
                // est attendue
                break;
          case paquet2 :
                // On réagit en conséquence
                break;
          default :
                // On réagit en conséquence
                break;
    }
}
Mais cette méthode ne réceptionnait pas tous les paquets, les paquets prenait trop de temps à être traités et donc il y avait certains messages non réceptionnés. Ceci menant à une erreur.

J'ai donc opté pour une boucle d'écoute (threadée) qui stockerait les paquet dans une variable de type "queue" . A coté de cela j'ai créée une fonction processQueue(), qui se chargerait de vider la queue et traiter les paquets.
Mais hélas cette fonction aussi était vouée a l'échec. Il y avait souvent acces concurrents a mes variables membres, et les mutex ajoutés pour régler cela ne faisait que ralentir le code, voir le stopper.

un petit exemple :

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
 
listener()
{
    while(true)
    {
        // Reception des données
        // stockage des données dans une variables queue
    }
}
processQueue()
{
    // Boucle vidant la queue et faisant appel la fonction adéquate en fonction
    // du message
}
 
// Et dans le constructeur on gère thread

Petit moment de répit, vous suivez toujours ??



Voila ce qui en est de mon coté, je vous pose donc la question a vous : comment feriez vous pour récupérer les paquets ?



PS : Ceci peut également être vu comme un sondage, je pense d'ailleurs mettre une balise [sondage] dans le titre ?