클라이언트/서버 애플리케이션 지침

클라이언트/서버 애플리케이션은 단일 컴퓨터 연결이 단일 사용자 세션과 동일하다고 가정해서는 안 됩니다. IP 주소 및 컴퓨터 이름에 설명된 문제의 특별한 경우입니다.

클라이언트/서버 연결을 고유하게 식별하려면 각 클라이언트 모듈에서 고유한 이름 또는 식별자를 사용해야 합니다. 애플리케이션은 명명된 개체 또는 파이프, 소켓 또는 기타 IPC 메서드를 사용할 수 있습니다. 자세한 내용은 커널 개체 네임스페이스를 참조하세요.

원격 데스크톱 서비스와 호환되려면 클라이언트/서버 애플리케이션의 서버 모듈이 동일한 컴퓨터에서 연결하는 여러 클라이언트를 처리할 수 있어야 합니다. 이를 위해 서버 모듈은 RPC 또는 명명된 파이프와 같은 잘 정의된 전역 인터페이스를 통해 클라이언트 연결을 수락해야 합니다. 서버와 클라이언트는 각 사용자 세션에 대해 다른 통신 채널을 협상해야 합니다. 클라이언트는 각 클라이언트 애플리케이션에 대해 다른 소켓 연결을 사용할 수 있는 TCP/IP와 같은 이러한 유형의 작업을 쉽게 지원하는 프로토콜을 사용하여 서버에 대한 연결을 설정해야 합니다.

클라이언트 모듈은 ProcessIdToSessionId 함수를 호출하여 원격 데스크톱 서비스 세션의 식별자를 검색할 수 있습니다. 그런 다음 클라이언트는 일종의 프로세스 간 통신을 사용하여 세션 식별자를 서버 모듈에 전달합니다. 그런 다음 클라이언트 및 서버 모듈은 세션 식별자를 사용하여 프라이빗 통신 채널을 설정할 수 있습니다. 예를 들어 서버 모듈은 세션 식별자를 사용하여 커널 개체에 대한 세션 네임스페이스의 개체에 액세스할 수 있습니다.

또한 서버 모듈은 WTSQuerySessionInformation 호출에서 세션 식별자를 사용하여 클라이언트에 대한 추가 정보를 검색할 수 있습니다. 서버 모듈은 WTSSendMessage 호출에서 세션 식별자를 사용하여 클라이언트 터미널에 메시지를 표시할 수도 있습니다. 서버 모듈은 세션에 대한 클라이언트 연결 및 연결 끊기를 모니터링하는 두 개의 이벤트를 만들 수도 있습니다. 그러나 이렇게 하려면 원격 데스크톱 세션 호스트(RD 세션 호스트) 서버에 등록해야 합니다. 자세한 내용은 모니터링 세션 연결 및 연결 끊기를 참조하세요.

사용자 입력 프롬프트는 클라이언트/서버 애플리케이션에 대한 잠재적인 문제의 소스입니다. 예를 들어 서비스에서 MessageBox 함수를 호출하면 메시지 상자가 클라이언트 데스크톱이 아닌 RD 세션 호스트 서버의 바탕 화면에 표시됩니다. 클라이언트 데스크톱에 메시지를 표시하기 위해 서비스는 WtsSendMessage 함수를 호출할 수 있습니다. 또는 서비스가 클라이언트 모듈에서 입력을 요청할 수 있으며 클라이언트 모듈은 사용자 인터페이스를 표시하고 결과 입력을 서비스에 다시 보낼 수 있습니다.

여러 세션에서 생성된 프로세스는 공유 메모리 블록을 사용하여 서로 데이터를 보내고 받을 수 있습니다. 자세한 내용은 명명된 공유 메모리 만들기를 참조하세요. 공유 메모리는 다음 조건에서 사용할 수 없습니다.

  • 공유 메모리 블록을 사용하는 프로세스는 여러 세션에서 생성되었습니다.
  • 세션은 동일한 사용자 인증 자격 증명을 공유합니다.