실행하려면 Visual C++ Distributable Package를 설치해야 한다
easyVNC.rar // 소스
release.rar // 실행 파일
처음으로 클라이언트 서버 기반의 프로그램을 하느냐 참 용썼다. 그러나, 이번 기회에 네트워크 프로그래밍에 대해 이모저모 알게된 기회였다. 물론 아직도 태부족이다. 그래도 쓰기 쉽게 해준다고 라이브러리로 만들고 이름도 멋있게 easy~를 붙였는데 쩝...
많은 시행착오를 겪었다. 여러 네트워크 라이브러리를 테스트했다. 최종적으로 HawkNL(http://www.hawksoft.com/hawknl/)을 사용하여 구현했다. HawkNL은 사용하기 쉽고 소스도 공개되어 있어 세부 사항을 알기도 좋다. 무엇보다 스레드 기반. 그러나 OpenTNL 처럼 메모리 관리까지 자동으로 하지는 않는다.
나는 다음과 같은 식으로 구현했다.
- 서버와 클라이언트는 스레드를 하나 발생시키고 이들에게 서버, 클라이언트 역할을 수행하는 클래스 포인터를 넘긴다.
- 서버나 클라이언트는 필요할 때마다 특정 헤더의 메시지를 발생시키고, 그 메시지에 따라 역할을 수행한다.
- 데이터 전송 시에는 적절한 크기로 잘라서 보낸다.
- 메모리 관리: 버퍼는 하나만 유지하되, 더 큰 메모리 할당 요구가 있을 때까지 재할당하지 않는다. 버퍼 클래스는 내부적으로 실제 크기, 사용 크기를 별도의 정보로 갖는다.
이 프로그램은 클라이언트가 접속을 끊었을 때 문제가 발생한다. 어째서인지 모르겠으나 서버가 데이터 전송하는 중에 클라이언트가 접속을 끊을 경우 서버는 클라이언트의 접속 종료를 인식하지 못하는 경우가 있다. 아마 십중팔구 나의 실수라고 추측된다. 데이터를 보내는 중에는 제대로 소켓 상태를 점검하지 않겠지...
만약 다음에 손을 본다면 개선할 점은 다음과 같다.
- 압축: 메모리의 비트맵 데이터를 JPEG로 변환해서 보낸다. 그러나 이 방식은 ZIP으로 압축하는 것보다 압축 효율이 떨어지고 손상 압축이라 화질도 좋지 않다.
- MFC에서의 문제점: 왜 그럴까? MFC에서는 콘솔을 띄우지 않으면 화면에 표시를 하지 못한다. 핸들을 제대로 못 받아 오거나, 내가 MFC 뷰에 표시하는 방법을 제대로 모르는 것일 수 있다.
- 팔레트 축소: 분석할 코드는 여기 http://www.xdp.it/cquantizer.htm.
사용한 라이브러리
- CxImage 5.99c : 이미지 처리를 매우 쉽게 할 수 있다. 테스트하려면 여기
- HawkNL 1.7 Beta
개발 환경
- Visual C++ 2005
'코드' 카테고리의 다른 글
CQ: Calculation Quotient (0) | 2006.11.19 |
---|---|
V Player (0) | 2006.11.19 |
OpenTNL API를 이용하여 메모리 데이터 전송하기 (0) | 2006.10.04 |
Windows Platform SDK의 DirectShow 샘플 컴파일하기 (0) | 2006.09.29 |
prototype for CxImage library (0) | 2006.09.18 |