web-dev-qa-db-fra.com

Augmentation de la limite de FD_SETSIZE et sélectionnez

Je souhaite augmenter la valeur de la macro FD_SETSIZE pour mon système. Existe-t-il un moyen d'augmenter FD_SETSIZE afin que la sélection n'échoue pas

18
Vivek Goel

Selon les normes, il n'y a aucun moyen d'augmenter FD_SETSIZE. Certains programmes et bibliothèques (libevent me vient à l'esprit) essaient de contourner ce problème en allouant de l'espace supplémentaire pour l'objet fd_set Et en transmettant des valeurs supérieures à FD_SETSIZE Aux macros FD_*, Mais c'est une très mauvaise idée car des implémentations robustes peuvent effectuer une vérification des limites de l'argument et abandonner s'il est hors de portée.

J'ai une solution alternative qui devrait toujours fonctionner (même si elle n'est pas requise par les normes). Au lieu d'un seul objet fd_set, Allouez-en un tableau suffisamment grand pour contenir le fd maximum dont vous aurez besoin, puis utilisez FD_SET(fd%FD_SETSIZE, &fds_array[fd/FD_SETSIZE]) etc. pour accéder à l'ensemble.

13
R..

Je suggère également d'utiliser poll si possible. Et il existe plusieurs bibliothèques de traitement "d'événements" comme libevent ou libev (ou les capacités d'événement de Glib de GTK, ou QtCore , etc) qui devrait vous aider. Il y a aussi des choses comme epoll . Et votre problème est lié à C10k

13

Il serait préférable (et facile) de remplacer par sondage. En général, poll () est un simple remplacement de select () et n'est pas limité par le 1024 de FD_SETSIZE ...

fd_set fd_read;
int id = 42;
FD_ZERO(fd_read);
FD_SET(id, &fd_read);
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
if (select(id + 1, &fd_read, NULL, NULL, &tv) != 1) {
   // Error.
}

devient:

struct pollfd pfd_read;
int id = 42;
int timeout = 5000;
pfd_read.fd = id;
pfd_read.events = POLLIN;
if (poll(&pfd_read, 1, timeout) != 1) {
   // Error
}

Vous devez inclure poll.h pour la structure pollfd.

Si vous avez besoin d'écrire et de lire, définissez l'indicateur d'événements sur POLLIN | POLLOUT.

8
Simon Gymer

en fait, il existe [~ # ~] [~ # ~] un moyen d'augmenter FD_SETSIZE sur Windows. son défini dans winsock.h et par Microsoft eux-mêmes, vous pouvez l'augmenter en le définissant simplement AVANT d'inclure winsock.h

http://support.Microsoft.com/kb/111855

Je le fais tout le temps et je n'ai eu aucun problème. La plus grande valeur que j'ai utilisée était d'environ 5000 pour un serveur que je développais.

2
BrierMay