Comment parcourir une fd_set
Je me demande si il ya un moyen facile de parcourir un fd_set? La raison pour laquelle je veux faire, c'est de ne pas avoir à parcourir tous les sockets connectées, depuis select() modifie ces fd_sets pour inclure uniquement ceux que je suis intéressé à ce sujet. Je sais aussi que, à l'aide d'une mise en œuvre d'un type qui n'est pas destiné à être directement accessible est généralement une mauvaise idée, car il peut varier entre différents systèmes. Cependant, j'ai besoin de quelques façon de le faire, et je suis à cours d'idées. Donc, ma question est:
Comment puis-je effectuer une itération sur un fd_set? Si c'est une très mauvaise pratique, existe-il d'autres façons de résoudre mon "problème" à l'exception d'une boucle sur tous les sockets connectées?
Grâce
source d'informationauteur Andreas | 2010-09-07
Vous devez vous connecter pour publier un commentaire.
Sélectionnez définit le bit correspondant dans le fichier descripteur dans l'ensemble, donc, vous avez besoin de ne pas parcourir toutes les fds si vous êtes intéressé par seulement quelques-uns (et peut ignorer les autres) juste tester seulement les fichiers descripteurs pour lequel vous êtes intéressé.
MODIFIER
Voici la fd_set struct:
Où, fd_count est le nombre de sockets set (ainsi, vous pouvez ajouter une optimisation de l'utilisation de ce) et fd_array est un peu-vecteur (de la taille FD_SETSIZE * sizeof(int) qui est dépend de la machine). Sur ma machine, il est de 64 * 64 = 4096.
Donc, votre question est pour l'essentiel: quel est le moyen le plus efficace pour trouver les positions de bits de 1s dans un peu de vecteur (de taille autour de 4096 bits)?
Je veux les choses au clair ici:
"en passant à travers tous les sockets connectées" ne veut pas dire que vous êtes en train de lire/faire des trucs pour une connexion. FD_ISSET() ne vérifie la météo le bit dans le fd_set positionné au niveau de la connexion est attribué file_descriptor nombre est définie ou pas. Si l'efficacité est votre but, n'est-ce pas le plus efficace? à l'aide de l'heuristique?
S'il vous plaît dites-nous quel est le problème avec cette méthode, et ce que vous essayez d'atteindre à l'aide de la méthode de remplacement.
Vous devez remplir un fd_set struct avant l'appel à select(), vous ne pouvez pas vous passer vos originaux de std::set de douilles directement. sélectionnez() modifie la fd_set en conséquence, en supprimant toutes les prises de courant ne sont pas "ensemble", et renvoie le nombre d'emplacements restants. Vous avez de la boucle grâce à la naissance de fd_set, pas votre std::set. Il n'est pas nécessaire d'appeler FD_ISSET (), car la fd_set ne contient que "set" sockets qui sont prêts, par exemple:
Où FD_ISSET() entre en jeu plus souvent lors de l'utilisation de la vérification des erreurs avec select(), par exemple:
C'est assez simple:
Cette boucle est une limitation de la
select()
interface. Les implémentations sous-jacentes defd_set
sont généralement un ensemble de bits, ce qui signifie évidemment que la recherche d'un socket nécessite la numérisation sur les bits.C'est précisément pour cette raison que plusieurs autres interfaces ont été créés - malheureusement, ils sont tous les systèmes d'exploitation spécifiques. Par exemple, Linux fournit epollqui retourne une liste uniquement les descripteurs de fichier qui sont actives. FreeBSD et Mac OS X à la fois fournir des kqueuequi effectue le même résultat.
Voir cette section 7.2 de Beejguide de mise en réseau - '7.2. select()—e/S Synchrones Multiplexage " en utilisant FD_ISSET.
en bref, vous devez parcourir un fd_set afin de déterminer si le descripteur de fichier est prêt pour la lecture/écriture...
Je ne pense pas que ce que vous essayez de faire est une bonne idée.
D'abord son dépendante du système, mais je crois que vous le savez déjà.
Deuxièmement, sur le plan interne de ces ensembles sont stockées dans un tableau d'entiers et df sont stockées en tant que bits. Maintenant, selon les pages man de sélectionner le FD_SETSIZE est de 1024.
Même si vous vouliez effectuer une itération sur et obtenir votre intéressés fd est que vous avez à boucle sur ce chiffre avec le désordre de manipulation de bits.
Donc, sauf si vous êtes en attente pour plus de FD_SETSIZE fd sur sélectionner, je ne crois pas possible, ce n'est pas une bonne idée.
Oh, attendez!!. En tout cas, ce n'est pas une bonne idée.
Je ne pense pas que vous pourriez faire beaucoup à l'aide de la
select()
appel de manière efficace. Les informations au "Le C10K problème" sont toujours valables.Vous aurez besoin d'une plate-forme de solutions spécifiques:
Ou vous pouvez utiliser une bibliothèque d'événements, de cacher la plate-forme détail pour vous libev