客户端/服务器应用程序准则

客户端/服务器应用程序不得假定单个计算机连接等效于单个用户会话。 这是 IP 地址和计算机名称中讨论的问题的一种特殊情况。

若要唯一标识客户端/服务器连接,每个客户端模块必须使用唯一的名称或标识符。 应用程序可以使用命名对象或管道、套接字或其他 IPC 方法。 有关详细信息,请参阅 内核对象命名空间

若要与远程桌面服务兼容,客户端/服务器应用程序中的服务器模块必须能够处理从同一台计算机连接的多个客户端。 为此,服务器模块必须通过定义完善的全局接口(如 RPC 或命名管道)接受客户端连接。 服务器和客户端必须为每个用户会话协商不同的信道。 客户端必须使用可轻松支持此类操作的协议(例如 TCP/IP)与服务器建立连接,其中每个客户端应用程序可以使用不同的套接字连接。

客户端模块可以调用 ProcessIdToSessionId 函数来检索其远程桌面服务会话的标识符。 然后,客户端使用某种形式的进程间通信将其会话标识符传递给服务器模块。 然后,客户端和服务器模块可以使用会话标识符来设置专用信道。 例如,服务器模块可以使用会话标识符来访问内核对象的会话命名空间中的对象。

此外,服务器模块可以使用 WTSQuerySessionInformation 调用中的会话标识符来检索有关客户端的其他信息。 服务器模块还可以使用 WTSSendMessage 调用中的会话标识符在客户端终端上显示消息。 服务器模块还可以创建两个事件来监视客户端与会话的连接和断开。 但是,必须在远程桌面会话主机 (RD 会话主机) 服务器上注册它才能执行此操作。 有关详细信息,请参阅 监视会话连接和断开连接

用户输入提示是客户端/服务器应用程序问题的潜在根源。 例如,如果服务调用 MessageBox 函数,则消息框显示在 RD 会话主机服务器的桌面上,而不是在客户端桌面上。 若要在客户端桌面上显示消息,服务可以调用 WtsSendMessage 函数。 或者,服务可以从客户端模块请求输入,客户端模块可以显示用户界面,并将生成的输入发送回服务。

从多个会话生成的进程可以通过使用共享内存块相互发送数据和接收数据。 有关详细信息,请参阅 创建命名共享内存。 在以下情况下无法使用共享内存:

  • 使用共享内存块的进程由多个会话生成。
  • 会话共享相同的用户身份验证凭据。