2008-08-04 20 views
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#.Comunicación asincrónica multiservicio servidor-cliente en el mismo socket abierto?

Originalmente, solo lo necesitaba para enviar mensajes desde el 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 con el efecto de WaitForMultipleObjects() y pasarle un búfer de recepción y un evento que indique que hay datos para enviar?

Respuesta

7

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

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

también, pero no sé si eso es aplicable para usted, que tenía una especie de latido del corazón los clientes se envían al servidor, dejando que se sabía que estaba todavía 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.

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 asincrónicamente 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.

3

Echa un vistazo 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 tratado de vincular una DLL estándar de C++ con un proyecto de C#), 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.

7

¡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 denominado patrón de reactor (look at this book). Alguna biblioteca de red bien conocida proporciona una implementación de este patrón (look at ACE).

En pocas palabras, el reactor es un objeto, registras todos los 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.

Cuestiones relacionadas