Optimisation de code, liens entre objets [Résolu]

Signaler
Messages postés
57
Date d'inscription
mercredi 5 septembre 2007
Statut
Membre
Dernière intervention
22 juillet 2010
-
Messages postés
57
Date d'inscription
mercredi 5 septembre 2007
Statut
Membre
Dernière intervention
22 juillet 2010
-
Bonjour, je cherche à optimiser une partie de mon code
Je suis en train de développer un serveur SSL avec Qt;
j'ai plusieurs classes:
-CoreServer
-Client (QObject)
|-ClientSocket (QSslSocket)
|-ClientUser
La Classe client contient entre autre un pointeur vers le socket SSl du client

Quand je reçoit des données sur mon serveur je récupère le socket via


QSslSocket *socket = qobject_cast<QSslSocket *>(sender());


Je cherche à récupérer le client qui possède ce socket, la seul technique que j'ai trouvé c'est de faire une boucle dans tout mes clients. (clients est une liste qui contient tous mes clients,clients[i]->socket() retourne un pointeur vers le ClientSocket)


Client *client=NULL;

for (int i = 0; i < clients.size(); i++)
 {
     if(socket->socketDescriptor() == clients[i]->socket()->socketDescriptor())
     {
         client=clients[i];
     }
}


cette solution fonctionne, mais je pense qu'elle n'est pas du tout optimisé, je cherche donc une meilleur façon de faire!!

merci de votre lecture

4 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
L'intérêt c'est justement de ne plus faire de boucle.

typedef std::map<ClientSocket*, Client*> listeClient;
int main ()
{
  listeClient lc;

  ClientSocket* s = ???;

  // recherche du client correspondant à s
  lc::iterator it = lc.find(s);
  if(it != lc.end())
  {
    // client trouvé
    // client = it->second;
  }
  else
  {
    // client non trouvé
  }
}



_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Déjà, tu peux optimiser en arrêtant ta boucle quand tu as trouvé un résultat.
Si ton nombre de clients n'est pas très grand (disons inférieur à 20), ta méthode ne me choque pas.
Par contre si tu as beaucoup de clients, tu as intérêt à utiliser une map<ClientSocket*, Client*>, qui va te permettre de retrouver facilement ton Client à partir de ton ClientSocket.
L'accès dans une map est en O(log n) contre O(n) pour ton algo actuel.

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
57
Date d'inscription
mercredi 5 septembre 2007
Statut
Membre
Dernière intervention
22 juillet 2010

Avez vous un exemple d'utilisation des maps?


typedef std::map<ClientSocket*, Client*> listeClient;

int main ()
{
  listeClient lc;

//je rempli ma liste

  lc::iterator it;


 for (it = a.begin (); it != a.end (); ++it)
    {
      ClientSocket *socket = (*it).first;

      Client *client = (*it).second;

     //si je connais le socket comment je fais pour récupérer le client

    }

Messages postés
57
Date d'inscription
mercredi 5 septembre 2007
Statut
Membre
Dernière intervention
22 juillet 2010

oula, ca à l'air magique :) comment j'ai pus m'en passer avant :) merci