whatwg spec csgo commands c++ sockets select asynchronous

c++ - spec - select() max sockets



html spec (4)

No dice qué sistema operativo está usando, pero para la mayoría, si desea usar descriptores de archivo por encima de 1024 con select, puede #define FD_SETSIZE para ser un número mayor ANTES de #incluyendo sys / socket.h. Desafortunadamente, esto no funciona en Linux.

¡Solo más cosas asíncronas!

De acuerdo, ahora tengo un programa de socket asíncrono que funciona para mi aplicación principal de chat, ¡y está funcionando realmente bien! Sin embargo, tengo una preocupación ...

Al usar select (), ¿cuál es el número máximo de descriptores de archivo que puedo usar en cada conjunto? He leído sobre un límite de 1024 ...

Si ese límite está realmente codificado y no puedo FD_SETSIZE el límite más alto, ¿debería engendrar otro hilo una vez que alcanzo ese límite? ¿O algo mas? ¿Esto es incluso una preocupación?


Para un número realmente grande de tomas de corriente investiga el uso de una biblioteca como libevent .

La biblioteca puede abstraer varias funciones avanzadas específicas del sistema operativo como / dev / poll, kqueue, epoll y puertos de eventos. Con estos, puedes manejar un gran número de conexiones.


Si está programando bajo un sistema compatible con Posix, debería poder usar la función encuesta () en lugar de seleccionar () y esto eliminará el límite que mencionó. Alternativamente, puede llamar a select () varias veces seguidas, pero asegúrese de usar un tiempo de espera relativamente corto.


Sí, FD_SETSIZE tiene un límite de 1024. Puede verificarlo fácilmente mirando el encabezado select.h. La gente ha intentado aumentar el límite, pero los informes varían de "trabajo" a "bloquearse" después de un tiempo. Si necesita tantas conexiones, use poll lugar.

Un muy buen artículo para leer.