Google 팀에서 Windows에 VNC 뷰어 (= VNC 클라이언트)를 구현 중입니다. 프로토콜 (RFB)은 상태 저장 (stateful)입니다. 즉, 시청자가 1 바이트를 읽고 무엇인지 확인한 다음 3 바이트 또는 10 바이트를 더 읽고 구문을 분석해야합니다.VNC 뷰어 구현
비동기 소켓과 단일 (UI) 스레드를 사용하기로 결정했습니다. 결과적으로 두 가지 방법이 있습니다 :
1) 상태 머신 - 소켓 읽기시 블록을 얻으면 현재 상태를 기억하고 종료합니다. 나중에 소켓 알림이 도착하고 인터럽트 된 로직이 적절한 단계에서 다시 시작됩니다.
2) 내부 메시지 루프 - 소켓에서 읽기가 차단된다고 판단되면 내부 메시지 루프를 시작하여 필요한 모든 데이터가 최종 수신 될 때까지 회전합니다. 블록의 경우 UI가 이와 같이 동결되지 않습니다.
경험에 따르면 두 번째 방법은 내부 메시지 루프에있는 동안 모든 메시지가 올 수 있으므로 좋지 않습니다. 여기에서 전체 내용을 말할 수는 없지만 단순히 신뢰할 만하지는 않습니다. 충돌과 불규칙.
첫 번째 옵션은 상당히 받아 들여질 수 있지만 이러한 스타일로 프로그래밍하는 것은 쉽지 않습니다. 알고리즘의 상태와 추가 처리에 필요한 모든 로컬 변수의 값을 기억해야합니다.
여러 스레드를 사용할 수는 있지만 프레임 버퍼 액세스 동기화, 멀티 스레딩 문제 등이 훨씬 더 어려울 것으로 생각했습니다. 비동기 소켓을 사용하는 것 또한 필요합니다.
그래서 어떤 점에서 최선이라고 생각하십니까?
문제는 상당히 일반적인 문제입니다. 이것은 상태 저장 프로토콜을 통한 비동기 통신 구성의 문제점입니다.
편집 1 : 우리는 C++과 MFC를 UI 프레임 워크로 사용합니다.
어떤 언어입니까? 비동기 프레임 워크는 일반적으로 비동기 IO 루프 구현의 더러운 세부 사항을 차폐하는 데있어 매우 효과적입니다. Java 용 Netty –
C++/MFC 응용 프로그램. –