¿Comunicación asíncrona multidireccional servidor-cliente a través del mismo socket abierto?

StackOverflow https://stackoverflow.com/questions/1241

  •  08-06-2019
  •  | 
  •  

Pregunta

Tengo una aplicación cliente-servidor donde el cliente está en un dispositivo 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 un acuse de recibo de que recibió 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 enviar datos al servidor, esto no permite que el servidor envíe una solicitud en ningún momento.Tendría que esperar a los datos del cliente.Mi primer pensamiento sería crear otro hilo en el cliente con un socket abierto separado, escuchando las solicitudes del servidor... tal como el servidor ya lo ha hecho con respecto al cliente.¿Hay alguna manera, dentro del mismo hilo y usando el mismo socket, de que todos los servidores envíen solicitudes en cualquier momento?

¿Puedes usar algo en el sentido de WaitForMultipleObjects() ¿Y pasarle un búfer de recepción y un evento que le indique que hay datos para enviar?

¿Fue útil?

Solución

Cuando necesité escribir una aplicación con un modelo cliente-servidor donde los clientes pudieran salir y entrar cuando quisieran (supongo que ese también es el caso para tu aplicación ya que usas dispositivos móviles) me aseguré de que los clientes enviaran un en línea mensaje al servidor, indicando que estaban conectados y listos para hacer lo que fuera necesario.

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 se aplica a usted, tuve algún tipo de latido del corazón los clientes enviaron al servidor, haciéndole saber que todavía estaba en línea.De esa manera, el servidor sabe cuándo un cliente fue desconectado por la fuerza de la red y podría volver a marcarlo como desconectado.

Otros consejos

¡Usar comunicación asincrónica es totalmente posible en un solo hilo!

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

En pocas palabras, el reactor es un objeto, registras todos tus enchufes en su interior y esperas algo.Si sucedió algo (llegaron nuevos datos, se cerró la conexión...) el reactor te lo notificará.Y, por supuesto, puede utilizar sólo un socket para enviar y recibir datos de forma asincrónica.

No tengo claro si desea agregar los bits asincrónicos al servidor en C# o al cliente en C++.

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

No sé si las plataformas Windows Mobile admiten estas funciones, por lo que es posible que tengas que investigar un poco más.

Verificar asiático.Es una biblioteca C++ compatible cruzada para IO asíncrona.No estoy seguro de si esto sería útil para el servidor (nunca he intentado vincular una DLL estándar de C++ a un proyecto de C#), pero sería útil para el cliente.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top