Optimisation de code, liens entre objets

Résolu
szambaux Messages postés 56 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 22 juillet 2010 - 22 juil. 2010 à 11:34
szambaux Messages postés 56 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 22 juillet 2010 - 22 juil. 2010 à 12:17
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
22 juil. 2010 à 12:14
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
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
22 juil. 2010 à 11:52
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
szambaux Messages postés 56 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 22 juillet 2010
22 juil. 2010 à 12:09
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

    }

szambaux Messages postés 56 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 22 juillet 2010
22 juil. 2010 à 12:17
oula, ca à l'air magique :) comment j'ai pus m'en passer avant :) merci
Rejoignez-nous