Поделиться через


Рекомендации по клиентским и серверным приложениям

Клиентские и серверные приложения не должны предполагать, что подключение к одному компьютеру эквивалентно одному сеансу пользователя. Это особый случай проблемы, обсуждаемой в разделе IP-адреса и имена компьютеров.

Для уникальной идентификации подключения клиента или сервера каждый клиентский модуль должен использовать уникальное имя или идентификатор. Приложения могут использовать именованные объекты или каналы, сокеты или другие методы IPC. Дополнительные сведения см. в разделе Пространства имен объектов ядра.

Чтобы обеспечить совместимость служб удаленных рабочих столов, серверный модуль в клиенте или серверном приложении должен иметь возможность обрабатывать несколько клиентов, подключающихся с одного компьютера. Для этого серверный модуль должен принимать клиентские подключения через четко определенный глобальный интерфейс, например RPC или именованные каналы. Сервер и клиент должны согласовывать разные каналы связи для каждого сеанса пользователя. Клиент должен установить соединение с сервером с помощью протоколов, которые легко поддерживают этот тип операций, таких как TCP/IP, где для каждого клиентского приложения можно использовать разные подключения сокета.

Клиентский модуль может вызвать функцию ProcessIdToSessionId , чтобы получить идентификатор сеанса служб удаленных рабочих столов. Затем клиент использует некоторую форму межпроцессного взаимодействия для передачи идентификатора сеанса в серверный модуль. Затем клиентский и серверный модули могут использовать идентификатор сеанса для настройки частного канала связи. Например, серверный модуль может использовать идентификатор сеанса для доступа к объектам в пространстве имен сеанса для объектов ядра.

Кроме того, серверный модуль может использовать идентификатор сеанса в вызове WTSQuerySessionInformation для получения дополнительных сведений о клиенте. Серверный модуль также может использовать идентификатор сеанса в вызове WTSSendMessage для отображения сообщения в терминале клиента. Серверный модуль также может создавать два события для отслеживания подключения клиента к сеансу и отключения от сеанса. Однако для этого он должен быть зарегистрирован на сервере узла сеансов удаленных рабочих столов (узел сеансов удаленных рабочих столов). Дополнительные сведения см. в разделе Мониторинг подключений к сеансам и отключений.

Запросы на ввод данных пользователем являются потенциальным источником проблем для клиентских и серверных приложений. Например, если служба вызывает функцию MessageBox , окно сообщения отображается на рабочем столе сервера узла сеансов удаленных рабочих столов, а не на рабочем столе клиента. Чтобы отобразить сообщение на рабочем столе клиента, служба может вызвать функцию WtsSendMessage . Кроме того, служба может запрашивать входные данные из клиентского модуля, а клиентский модуль может отображать пользовательский интерфейс и отправлять полученные входные данные обратно в службу.

Процессы, порожденные из нескольких сеансов, могут отправлять данные друг другу и получать данные друг от друга с помощью блоков общей памяти. Дополнительные сведения см. в разделе Создание именованной общей памяти. Общая память не может использоваться при следующих условиях:

  • Процессы, использующие блок общей памяти, были порождены несколькими сеансами.
  • Сеансы используют одни и те же учетные данные для проверки подлинности пользователя.