2010-09-17 5 views
0

Je débute sur la façon de mapper une structure utilisateur à leur descripteur de fichier socket. Je pensais garder un tableau de pointeurs vide d'une taille MAX_CONNECTIONS, et stocker le pointeur comme valeur pour la clé du descripteur de fichier.Mappage efficace des utilisateurs sur les sockets

Le problème que je rencontre est la façon dont je prévois de gérer mes reçus. J'appelle actuellement pipe() pour faire un tuyau, puis fork() le processus pour gérer recv. Je voudrais probablement garder une trace de ceux-ci, aussi, pour être en mesure de gérer.

Ce que je fais actuellement est une boucle à travers une liste chaînée des utilisateurs, trouver celui qui correspond le descripteur, et aller de là

Question: Est-ce une méthode efficace et/ou acceptable des prises de cartographie aux utilisateurs connectés à eux, ou devrais-je pratiquer une autre sorte de vaudou?

J'apprécie tout effort donné envers mon dilemme (sans doute inutile).

+0

Vous utilisez vraisemblablement 'poll()' ou 'epoll()' plutôt que 'select()', alors? – caf

+0

J'utilise select pour trouver quand j'ai besoin de lire. Y a-t-il une raison pour laquelle je devrais faire autrement? – Codeacula

Répondre

3

Si vous n'avez pas beaucoup de clients, alors ça va. Vous ne passerez pas beaucoup de temps pour un groupe d'utilisateurs. Vous pouvez essayer d'utiliser hashtable (ou un dictionnaire, un tableau associatif).

Il existe d'innombrables implémentations libres/ouvertes dans ANSI-C, ou vous pouvez simplement rouler les vôtres. Vous avez juste besoin d'un identifiant unique et constant par utilisateur, qui sera votre clé. Si vous voulez avoir une relation bidirectionnelle (carte bijective) vous pouvez juste avoir une autre hashtable où vous stockez les utilisateurs par descripteur de fichier.

Les opérations sur une table de hachage sont O (1) en moyenne. La hashtable elle-même utilise l'espace O (N), où N est un grand nombre (mais pas trop grand). Ne t'en fais pas pour ça non plus.

Jetez un oeil à this one. Vous pouvez également être intéressé par this question.

+0

J'ai fait mon propre depuis que tout cela est un exercice d'apprentissage. Merci pour les ressources et répondre! – Codeacula

+0

De rien! –

Questions connexes