On 8/25/08, Herr Groucho <[EMAIL PROTECTED]> wrote: > Hola. > Para resolver un problema, se me ha planteado la necesidad de hacer un > programa que acepte conexiones TCP desde equipos embebidos y les lea datos > que dichos equipos están recabando en campo. > > Actualmente el programa de esos equipos embebidos establece la conexión > TCP y la mantiene conectada todo el tiempo. Entonces el servidor que > acepta esas conexiones va a tener un socket conectado con cada equipo todo > el tiempo. Si hay 10 equipos, tendrá 10 conexiones abiertas. Pero qué pasa > cuando hay 10000 equipos y por lo tanto 10000 conexiones? > > El programa que va a aceptar las conexiones actualmente lanza un proceso > hijo por cada conexión que acepta. Eso tiene la ventaja de que el > tratamiento de TCP/IP y la implementación del protocolo de aplicación se > simplifica (sólo hay un socket del cual preocuparse y si el protocolo de > aplicación tiene que esperar un evento, directamente se puede bloquear en > un read() o write() o irse a dormir con timeout en un select()). > Con 10000 conexiones, tendría 10001 procesos. Es esta una estrategia > cuerda para manejar 10000 conexiones? > > - El sistema operativo soportará 10000 procesos (hace unos años el tamaño > de la tabla de procesos era elegido en tiempo de compilación del kernel, > en valores miserables como 200)? > - El stack TCP/IP soportará 10000 conexiones? > - Qué le pasará al consumo de memoria? > - Qué le pasará al multitasking si el scheduler tiene que mirar una tabla > de procesos tan grande cada unas pocas decenas de milisegundos? > > > Qué otras estrategias son concebibles? > - Un único proceso que atienda y maneje todas las conexiones, usando > arreglos para guardar los file descriptors de los sockets, select() para > esperar que pase algo interesante en alguno de ellos e iteraciones por > todos lados? > > - Un proceso que lance hijos, cada uno de los cuales maneje unos pocos > threads (un híbrido entre los 2) > > - Varios sistemas operativos independientes, corriendo en máquinas (reales > o virtuales) separadas ejecutando cada uno alguno de los programas > anteriores. > > Sugerencias?
No se si podras usar la funcion select[1] de C para sockets, pero es justamente para eso. [1] http://www.chuidiang.com/clinux/sockets/socketselect.php > > > -- > Herr Groucho > > ID Jabber: [EMAIL PROTECTED] > Clave pública GPG: hkp://pks.lugmen.org.ar > Fingerprint GPG: B7BD 0FC7 D9A2 66F3 4EFC 45EE 7DE2 3932 597B 6354 > > -- Lautaro Serenity Now!!
