Instrucciones de aplicación cliente/servidor
Las aplicaciones cliente/servidor no deben asumir que una única conexión de equipo es equivalente a una sola sesión de usuario. Este es un caso especial del problema que se describe en Direcciones IP y nombres de equipo.
Para identificar de forma única una conexión de cliente o servidor, cada módulo de cliente debe usar un nombre o un identificador únicos. Las aplicaciones pueden usar objetos con nombre o canalizaciones, sockets u otros métodos IPC. Para obtener más información, vea Espacios de nombres de objeto kernel.
Para ser compatible con Servicios de Escritorio remoto, el módulo de servidor de una aplicación cliente/servidor debe ser capaz de controlar varios clientes que se conectan desde el mismo equipo. Para ello, el módulo de servidor debe aceptar conexiones de cliente a través de una interfaz global bien definida, como RPC o canalizaciones con nombre. El servidor y el cliente deben negociar un canal de comunicación diferente para cada sesión de usuario. El cliente debe establecer una conexión con el servidor mediante protocolos que admitan fácilmente este tipo de operación, como TCP/IP, donde se puede usar una conexión de socket diferente para cada aplicación cliente.
El módulo cliente puede llamar a la función ProcessIdToSessionId para recuperar el identificador de su sesión de Servicios de Escritorio remoto. A continuación, el cliente usa alguna forma de comunicación entre procesos para pasar su identificador de sesión al módulo de servidor. A continuación, los módulos de cliente y servidor pueden usar el identificador de sesión para configurar un canal de comunicación privado. Por ejemplo, el módulo de servidor puede usar un identificador de sesión para tener acceso a objetos en el espacio de nombres de la sesión para los objetos kernel.
Además, el módulo de servidor puede usar el identificador de sesión en una llamada WTSQuerySessionInformation para recuperar información adicional sobre el cliente. El módulo de servidor también puede usar el identificador de sesión en una llamada WTSSendMessage para mostrar un mensaje en el terminal de cliente. El módulo de servidor también puede crear dos eventos para supervisar la conexión de cliente a una sesión y desconectarse de ella. Sin embargo, debe registrarse en el servidor host de sesión de Escritorio remoto (host de sesión de Escritorio remoto) para hacerlo. Para obtener más información, consulte Supervisión de conexiones de sesión y desconexiones.
Las solicitudes de entrada del usuario son un posible origen de problemas para las aplicaciones cliente o servidor. Por ejemplo, si un servicio llama a la función MessageBox , el cuadro de mensaje se muestra en el escritorio del servidor host de sesión de Escritorio remoto, no en el escritorio del cliente. Para mostrar un mensaje en un escritorio cliente, el servicio puede llamar a la función WtsSendMessage . Como alternativa, el servicio puede solicitar la entrada desde el módulo cliente y el módulo cliente puede mostrar la interfaz de usuario y enviar la entrada resultante de nuevo al servicio.
Los procesos generados a partir de varias sesiones pueden enviar y recibir datos entre sí mediante el uso de bloques de memoria compartidos. Para obtener más información, vea Crear memoria compartida con nombre. La memoria compartida no se puede usar en las siguientes condiciones:
- Los procesos que usan el bloque de memoria compartida se generaron en varias sesiones.
- Las sesiones comparten la misma credencial de autenticación de usuario.