Compartir a través de


Directrices de aplicación cliente/servidor

Las aplicaciones cliente/servidor no deben suponer que una sola conexión de equipo es equivalente a una sola sesión de usuario. Este es un caso especial del problema descrito en direcciones IP y nombres de equipo.

Para identificar de forma única una conexión de cliente o servidor, cada módulo cliente debe usar un nombre o identificador únicos. Las aplicaciones pueden usar objetos o canalizaciones con nombre, 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 poder 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. Después, 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 acceder a objetos del espacio de nombres de la sesión para objetos kernel.

Además, el módulo de servidor puede usar el identificador de sesión en un WTSQuerySessionInformation llamada para recuperar información adicional sobre el cliente. El módulo de servidor también puede usar el identificador de sesión en un llamada a WTSSendMessage para mostrar un mensaje en el terminal 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 de usuario son un posible origen de problemas para las aplicaciones cliente/servidor. Por ejemplo, si un servicio llama a la funciónMessageBox, 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 del módulo cliente y el módulo cliente puede mostrar la interfaz de usuario y enviar la entrada resultante 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 condiciones siguientes:

  • 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.