Comunicación asincrónica multiservicio servidor-cliente en el mismo socket abierto

votos
20

Tengo una aplicación cliente-servidor donde el cliente está en un dispositivo con Windows Mobile 6, escrito en C ++ y el servidor está en Windows completo y escrito en C #.

Originalmente, solo lo necesitaba para enviar mensajes del cliente al servidor, y el servidor solo enviaba una confirmación de que había recibido el mensaje. Ahora, me gustaría actualizarlo para que el servidor pueda enviar un mensaje al cliente para solicitar datos. Como actualmente lo tengo configurado para que el cliente solo esté en modo de recepción después de que envíe datos al servidor, esto no permite que el servidor envíe una solicitud en ningún momento. Tendría que esperar los datos del cliente. Lo primero que pensé fue crear otro hilo en el cliente con un zócalo abierto separado, escuchando solicitudes de servidor ... al igual que el servidor ya lo hizo con respecto al cliente. ¿Hay alguna manera, dentro del mismo hilo y usando el mismo socket, para que todo el servidor envíe solicitudes en cualquier momento?

¿Se puede usar algo para el efecto de WaitForMultipleObjects()y pasarle un búfer de recepción y un evento que le dice que hay datos para enviar?

Publicado el 04/08/2008 a las 14:52
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
7

¡Usar la comunicación asíncrona es totalmente posible en un solo hilo!

Hay un patrón de diseño común en el desarrollo de software de red llamado patrón de reactor ( vea este libro ). Alguna biblioteca de red bien conocida proporciona una implementación de este patrón ( vea ACE ).

En pocas palabras, el reactor es un objeto, registras todos tus enchufes y esperas algo. Si algo sucedió (nuevos datos llegaron, conexión cerrada ...) el reactor lo notificará. Y, por supuesto, puede usar solo un socket para enviar y recibir datos de forma asincrónica.

Respondida el 17/08/2008 a las 14:53
fuente por usuario

votos
7

Cuando necesitaba escribir una aplicación con un modelo de cliente-servidor donde los clientes podían salir e ingresar cuando querían (supongo que ese también es el caso para su aplicación cuando usa dispositivos móviles) me aseguré de que los clientes envíen un mensaje en línea al servidor, indicando que estaban conectados y listos para hacer lo que necesitaban hacer.

en ese momento, el servidor podría enviar mensajes al cliente a través de la misma conexión abierta.

Además, pero no sé si eso es aplicable para usted, tuve algún tipo de latido que los clientes enviaron al servidor, haciéndole saber que todavía estaba en línea. De esa forma, el servidor sabe cuándo se desconectó forzosamente a un cliente de la red y podría marcar a ese cliente como fuera de línea.

Respondida el 04/08/2008 a las 15:30
fuente por usuario

votos
3

Echa un vistazo a asio . Es una biblioteca de C ++ compatable para IO asíncrono. No estoy seguro de si esto sería útil para el servidor (nunca he intentado vincular una DLL estándar de C ++ al proyecto de CA #), pero para el cliente sería útil.

Lo usamos con nuestra aplicación y solucionó la mayoría de nuestros problemas de simultaneidad de IO.

Respondida el 11/08/2008 a las 11:00
fuente por usuario

votos
3

No estoy seguro de si desea agregar los bits asíncronos al servidor en C # o al cliente en C ++.

Si está hablando de hacer esto en C ++, las plataformas de escritorio de Windows pueden hacer E / S de socket de forma asincrónica a través de las API que usan E / S superpuestas. Para los sockets, WSASend, WSARecv ambos permiten la E / S asíncrona (lea la documentación en sus parámetros LPOVERLAPPED, que puede completar con eventos que se configuran cuando se completa la E / S).

No sé si las plataformas de Windows Mobile son compatibles con estas funciones, por lo que es posible que deba hacer algunas excavaciones adicionales.

Respondida el 05/08/2008 a las 06:30
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more