szambaux
Messages postés56Date d'inscriptionmercredi 5 septembre 2007StatutMembreDernière intervention22 juillet 2010
-
22 juil. 2010 à 11:34
szambaux
Messages postés56Date d'inscriptionmercredi 5 septembre 2007StatutMembreDernière intervention22 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
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!!
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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.
szambaux
Messages postés56Date d'inscriptionmercredi 5 septembre 2007StatutMembreDernière intervention22 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
}