Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
해당되는 게시물 2건
  Clipboard Viewer Chain Problem 
작성일시 : 2008. 10. 8. 11:51 | 분류 : Windows Server/Terminal Service | 태그 : clipboard, Clipboard Viewer Chain, Clipboard Viewer Chain Problem, problem, SBC, Share, Terminal Service, 동기화, 문제, 클립보드

최근에 Clipboard 와 관련된 문제가 있었습니다.
Windows 에서 가끔씩 Clipboard 의 내용이 공유가 않되는 경우가 있습니다.
특히 Terminal Service를 이용할 때 자주 발생하게 되는데, 이 가장 큰 이유는 RDPClip.exe의 Clipboard viewer Chain이 끈어지기 때문입니다.
그와 관련해 제 친구 동조 블로그에 좋은 글 (http://dongjo.tistory.com/102) 이 올라와서 부연 설명을 더해 드립니다.

Windows 에서 Clipboard의 내용은 각 Application 들이 각자 관리 하게 됩니다.
Clipboard를 사용하도록 선언이 되게 되면 이 App 들은 각자 Clipboard를 관리하게되며, 각 App들에서 Clipboard의 내용이 변경 되게 되면 해당 내용을 update 받게 됩니다. 이를 Clipboard viewer chain 이라 합니다.
이런 연관 관계를 Clipboard viewer chain 이라 합니다.

[Clipboard Viewer Chain의 생성]
최초로 A 라는 Clipboard를 사용 하는 app가 실행 됩니다.
-> A

B app 가 실행 됩니다.
-> B -> A

C 와 D app 가 차례로 실행 됩니다.
-> D -> C -> B -> A

[Clipboard Viewer Chain 에서 Clipboard 내용 변경]
-> D -> C -> B -> A 와 같은 체인의 B app에서 사용자가 clipboard 의 내용을 변경 합니다.
-> D -> C -> B -> A
                    ^
        clipboard 내용 변경

해당 내용의 자신의 Chain의 가장 앞 노드인 D에 알리게 되고 D는 자신과 연결된 Chain에 해당 Update 내용을 전달 하게 됩니다.

[Clipboard Viewer Chain 에서 app 종료]
-> D -> C -> B -> A 에서 B가 종료 됩니다.
-> D -> C -> A

이 경우 B의 위치에 A가 자리 하게 됩니다.
즉 B의 Windows 핸들 값을 A 값이 대체하게 됩니다.

[일반적인 문제 현상과 그 원인]
위의 예에서 B가 종료 되면서 자신의 핸들값을 A의 값으로 대체 하지 못하고, 종료 되는 경우 A는 고립이 되게 되며 clipboard의 update를 확인 할 수 없습니다.

이런 경우는 보통 B app 소스에 문제가 있는 경우 가 있습니다.
일반적으로 Windows.close 같은 함수를 이용하여 종료할 경우에는 위와 같은 문제가 발생 하지 않습니다.
하지만 process.kill 과 같은 함수를 이용할 경우 해당 kill 에 대한 예외 처리를 하지 않으면 종종 발생하는 것으로 보입니다.

아래와 같이 예외 처리를 해줍니다.
간단하게 자신의 Windows 핸들을 다음 노드의 핸들로 대체해주는 구문입니다.
그리고 WM_DESTROY는 바로 비정상 종료를 가르키는 상수 값입니다.

case WM_DESTROY:      ChangeClipboardChain(hwnd, hwndNextViewer);
     PostQuitMessage(0);
     Break;

[Terminal Service 이용시 Clipboard 공유 문제]
사용자가 Terminal 연결을 할 경우 Windows에서는 해당 사용자를 위한 세션을 생성하고 그 위에서 다양한 Terminal 환경을 위한 App 를 구동하게 됩니다.
이 중 서버와 클라이언트의 Clipboard 내용을 동기화 하게 위해서 사용하는 app가 있는데, 이 app가 RDPClip.exe 입니다.
사용자가 터미널 서버에 접속하게 되면 RDPClip.exe가 hidden Windows 를 생성하여 위에서 설명한것과 같이 clipboard를 공유하게 됩니다.
이때 중요한 것이 해당 app가 chain의 가장 첫번째 생성 노드라는 점 입니다.
즉 해당 노드 app 중 하나의 app만 정상 종료가 않되게 되는 상황이 발생하게 된다면 이 RDPChain.exe는 clipboard update 내용을 확인 할 수 없는 것입니다.

[Terminal Service 이용시 Clipboard 공유 문제 해결 방안]
근본적으로는 위에서 언급한 것과 같이 clipboard를 사용함에 있어 다양한 예외 상황에 대한 처리를 app에서 해주는 것이 좋습니다.
하지만 그게 불가능 하다면 단순하게 RDPClip.exe를 재 시작하여 문제를 해결 할 수 도 있습니다.
RDPClip.exe가 신규 노드로 추가가 된다면 당연 이전의 고립 문제는 해결이 되게 되는 것이죠.

Windows Vista 및 Windows 2008에서는 OS 차원에서 System Controlled Clipboard Chain을 제공하고 있어 위와 같은 문제가 발생 하지 않습니다.

[클립 보드 문제 해결 방법]
.

참고 및 출처
http://blogs.msdn.com/ts/archive/2006/11/16/why-does-my-shared-clipboard-not-work-part-1.aspx

Name   Password   Home   Secret   Submit
  내부 클럭와 Windows Time 동기화 방법 
작성일시 : 2008. 2. 20. 17:17 | 분류 : Windows Server/Kernel | 태그 : NTP, windows time, 내부 클럭, 동기화

방송과 관련된 장비 혹은 시간과 아주 critical한 관계가 있는 서버의 경우 별도로 ntp 서버와 시간을 동기화 하는 H/W가 있나봅니다.
뭐 제가 잘알지는 못하지만... 아무튼 그래서 내부 클럭에 Windows Time을 동기화 하는 방법을 알려드립니다.
(갑자기 기억난... IRQL에 3번째로 높은 레벨이 CPU 클럭 동기화 였죠... 그렇다면 H/W에서 지원하는 NTP 서버와 시간 동기화가 충분히 빛을 발할 것 같다는...)

Time 서버 설정은 이전 포스트(http://maystyle.tistory.com/271)를 참조하세요.

레지스트리 수정에는 신중을 기해야 합니다.

1. 시작, 실행을 차례로 누르고 regedit를 입력한 다음 확인을 누릅니다.

2. 다음 레지스트리 하위 키를 찾아 누릅니다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\AnnounceFlags

3. 오른쪽 창에서 AnnounceFlags를 마우스 오른쪽 단추로 누른 다음 수정을 누릅니다.

4. DWORD 값 편집에서 값 데이터 상자에 A를 입력한 다음 확인을 누릅니다.

5. 레지스트리 편집기를 종료합니다.

6. 명령 프롬프트에서 Windows 시간 서비스를 다시 시작하도록 다음 명령을 입력한 다음 Enter 키를 누릅니다.

net stop w32time && net start w32time

출처 : http://support.microsoft.com/kb/816042

Name   Password   Home   Secret   Submit