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
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.
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.
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.