본문 바로가기
다물칸 주소복사
조회 수 251 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
구분 강좌
출처 http://leigh.innori.com/2
요새 Pocket PC 플랫폼에서 C++로 서버/클라이언트 네트워크 프로그램을 개발하고 있습니다. 와이브로가 상용화되면, PDA 플랫폼에서도 꽤 많은 애플리케이션이 개발될 것 같아요. 플랫폼에 익숙하지 않아서 엄청 삽질을 하고 있는데, Pocket PC 네트워크 프로그램 개발 및 테스트 환경에 대해 몇 가지 새로 알게 된 것을 적어 보겠습니다.

1. MFC의 소켓 클래스는 사용하지 말자.

Windows CE 플랫폼에서는 절대 MFC의 CSocket이나 CAsyncSocket은 사용하지 마세요. PC기반에서도 사용해선 안될 악의 축인 놈들입니다. 특히 CE에서는 오동작이 많습니다. 연결할 서버가 죽어있는 경우에도 Connect 함수가 TRUE를 반환하는 아~주 악질인 넘들이니 절대 쓰지 마세요. 그냥 윈속 2.0에 정의되어 있는 기본 소켓 함수들을 가지고 작업하시는 것이 1000배 맘 편합니다.

2. ActiveSync 상에서의 PC와 Pocket PC 주소

일반적으로 Pocket PC에서 돌아가는 프로그램을 개발한다고 하면, Visual Studio.NET이나 Embedded Visual C++을 이용하여 소스 편집 및 컴파일은 데스크톱 PC에서 하고, 바이너리만 포켓 PC로 배포하여 테스트를 하게 됩니다. 바이너리 배포를 하려면 ActiveSync를 사용해야 하는데, ActiveSync상태에서는 PC를 통해 인터넷으로 연결됩니다. PC가 공유기처럼 작동하게 되지요.

PC쪽에 TCP 클라이언트를 만들고, Pocket PC에서 PC쪽으로 접속하는 거라면, 별 문제가 없습니다. Pocket PC 클라이언트에서는 데스크톱 PC의 IP만 제대로 지정하여 connect하면 됩니다. 굳이 WiFi로 연결되어 있지 않아도, ActiveSync를 통해서 PC쪽 서버에 접속할 수 있습니다.

만약, 데스크톱 PC가 인터넷에 연결되어 있지 않다면? 이러면 조금 문제가 되는데, 데스크톱 IP를 이용하여 Pocket PC가 PC에 연결할 수 없습니다. 외부에 데모를 나가서 개발 현황을 보여줘야 하는데, 프리젠테이션 환경이 열악하여 네트워킹이 안된다면 꽤나 난감하지 않을 수 없죠. 이런 경우 PC에 만들어 둔 서버에 접속하기 위해 'localhost'나 루프백 IP(127.0.0.1)을 사용하려고 하는 경우가 많은데, 요거 잘 작동하지 않습니다.

그럴 땐, Pocket PC에서 PC로 접속할 때 "192.168.55.100" IP를 사용하면 됩니다. ActiveSync로 PC와 Pocket PC가 연결되면 PC는 "192.168.55.100", Pocket PC는 "192.168.55.101" IP를 사용하게 됩니다. 데스크톱 PC에 웹서버가 설치되어 있고, Pocket PC에서 PC의 웹 컨텐츠에 접근해야 한다고 할때도 마찬가지로 http://192.168.55.100/contents.html 요런 식으로 URL을 쓰면 된답니다.

3. ActiveSync 상에서 PC에서 PDA로 접속하기

이제 PC가 서버가 아니라 Pocket PC가 서버가 되는 상황입니다. Wi-Fi로 연결된 상태라면, PC쪽이 서버일 때와 마찬가지로 그냥 Pocket PC쪽 IP로 접속하면 됩니다. 무선 AP와 무선 네트워크 카드, 그리고 TCP/IP 스택과 socket API가 알아서 다 해주겠죠?

하지만, 개발 중에는 Wi-Fi를 쓰는 게 매우 귀찮습니다. 소스를 컴파일해서 디바이스에 넣으려면 어짜피 ActiveSync를 사용해야 하기 때문이죠. 위에서도 썼지만, ActiveSync로 연결된 상태에서는 Wi-Fi는 무용지물이거든요. 무선 네트워크 카드에 배당해 둔 IP가 전혀 작동하지 않습니다. 그 IP로 접속해봐야 접속이 안됩니다. 컴파일 바이너리를 배포한 후 제대로 작동하는 지 테스트하려고 이제 디바이스를 크래들에서 빼내야 합니다. 문제가 생기면 또 크래들에 꽂은 후 다시 컴파일 배포... 크래들에서 빼서 또 테스트... 아 귀찮습니다. 게다가, 크래들에서 빼놓으면 EVC나 VS.NET에서 디버깅도 할 수 없죠. (전 개발용 보드로 개발해 본 적은 없어서, 뭐 시리얼 콘솔로 출력하면 되지 않냐 이런 말씀을 하셔도 이해 못합니다.)

아하~ 여기서 눈치 빠르신 분들은, 그럼 ActiveSync의 Pocket PC쪽 IP인 "192.168.55.101"로 접속하면 되지 않겠냐? 하시네요. 짝짝짝... 하지만 안됩니다. 여러번 시도해봤지만 안되더군요. 구글 친구들 (groups.google.com) 한테도 많이 물어봤지만, 시원스레 대답해주는 포스트는 없었습니다. 그래도 뉴스 그룹을 뒤지고 뒤져서 알아냈습니다. ActiveSync 상에서 PC -> Pocket PC로 접속할 땐 "127.0.0.1"을 써야합니다! 아하하....

자  이제 거의 다 됐습니다. "127.0.0.1"로 접속하고, 포트는 음... 한 20000 정도 해볼까요? Pocket PC 서버는 INADDR_ANY, 20000 포트에 바인딩하고 귀기울여 PC 클라이언트가 붙기를 기다립니다. 자 PC 클라이언트를 기동하고 connect 해봅시다... 음... 안됩니다, 안돼요 T_T

ActiveSync 상에서 PC -> PDA로 TCP 접속을 하려면, 이놈의 ActiveSync에 내가 몇번 포트를 proxy port로 사용할 것인지를 알려줘야 한다는군요. 잠시 짜증을 접어두고, regedit를 실행시켜봅시다. "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\ProxyPorts" 항목을 찾아보세요. ActiveSync가 Pocket PC와 통신할 때 사용하는 포트가 주르륵 리스팅되어 있습니다.

DWORD 값을 하나 만들고 이름을 "MyPort" 쯤으로 넣습니다. 값은 20000 (10진수로) 넣으면 되겠죠? 이제 다 끝났습니다. 레지스트리 에디터를 닫고, Pocket PC와 PC 프로그램을 작동시켜 봅니다. 접속돼라 돼라 돼라~ 오!!!! 이제 되는군요.

4. 맺으며

Pocket PC 플랫폼은 WIN32 시스템과 거의 동일해서, 개발 장벽이 낮은 편이랍니다. Windows 프로그래밍을 조금 경험해보신 분이라면, 큰 이질감없이 프로그램 개발을 하실 수 있죠. 그렇지만 Windows와 Windows CE는 역시 다른 운영체제라서 조금씩 차이가 나는 건 어쩔 수가 없나봅니다.

오늘 적은 팁들은 사실 별거 아닌건데, 딱히 알고 싶어도 금방 찾을 수가 없더군요. 아무쪼록 혹시나 제 글을 읽으신 분들이 조금이라도 도움이 되셨기를 바랍니다.