2012-04-24 19 views
5

necesito para conectar a miles de clientes a través de TCP en un protocolo propietario para adquirir datos de forma cíclica. Necesito escribir una aplicación de servidor .NET en C#.sondeo a través de miles de sockets TCP

El primer intento fue crear para cada socket TCP de un hilo propio, que funciona, pero necesita una gran cantidad de uso de la CPU.

supe que sería una idea mejor utilizar el threadpool .NET en su lugar. Por lo que tengo entendido (http://msdn.microsoft.com/en-us/library/ms973903.aspx) podría usar temporizadores para que cada socket adquiera los datos cíclicamente en un período determinado (como 1 segundo). Esto no funciona para mí porque los enchufes se agotan una vez que se abrió la conexión porque hay muchos más enchufes que deben abrirse antes de que los receptáculos abiertos vuelvan a girar.

Otro intento fue utilizar devoluciones de llamada asincrónicas. Esto funcionaría para mí, pero no sé cómo conseguir que los enchufes adquieran datos cíclicamente ???

+2

Las palabras "miles" e "hilos" no van de la mano. Intente ver si puede usar la palabra clave 'await' para las continuaciones, esto le permitirá escribir código contra los puertos de bloqueo sin que el código realmente bloquee con mucha frecuencia. Este es el tipo de principio detrás de Erlang y Stackless Python: dos lenguajes creados específicamente para la concurrencia de redes. –

+1

¿Por qué debe hacer un ciclo entre los clientes para adquirir datos? Sería más simple (aunque es relativo) mantener solo una lectura asíncrona publicada en cada socket y procesar los datos a medida que llegan. Si realmente necesita lecturas cíclicas, podría posponer el reenvío de una lectura asíncrona hasta que se hayan enviado todos los demás enchufes. –

+1

simplemente no sondee. –

Respuesta

6

Try usando de high performance API que permite simultáneamente la recepción de datos en un muy gran número de tomas de corriente, sin necesidad de utilizar un hilo por socket Socket. En la parte inferior del artículo, hay un enlace a una muestra completa. También hay una muestra en el artículo de MSDN para el SocketAsyncEventArgs class.

+0

La API de alto rendimiento del Socket parece ser capaz de manejar una gran cantidad de conexiones entrantes. Necesito abrir estas conexiones en su lugar. ¿Es posible usar la API de alto rendimiento del Socket para este propósito también? – sqeez3r

+1

Sí, crear y abrir un zócalo por cliente, a continuación, utilice [ 'Socket.ReceiveAsync()'] (http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.receiveasync.aspx) –

+1

Lo implementé de esta manera y funciona muy bien. ¡Gracias! – sqeez3r

0

Por qué no llena una cola con las direcciones que necesita para sondear y tener su grupo de subprocesos toma elementos de la cola para procesar?

Una vez que haya terminado con un elemento empuje hacia la parte posterior de la cola.

+3

Por un lado, si tiene muchas conexiones inactivas, perderá mucho tiempo revisándolas sin ningún motivo. –

+0

Creo que esto llevaría demasiado tiempo para miles de conexiones. Necesito actualizaciones de todos los sockets cada segundo si es posible. – sqeez3r

Cuestiones relacionadas