본문 바로가기

[ Windows Program ]/Windows API

멀티쓰레드 윈도우즈 소켓 프로그래밍 #1

흔히 윈도우즈 상에서 소켓 프로그래밍을 한다는 것은 비동기 방식에 의한 윈속 프로그래밍을 의미한다. 비동기 소켓 프로그래밍은 윈도우즈의 기본 디자인 개념에 맞게 유저 프로그램이 소켓을 모니터링 필요없이 윈속 모듈의 메시지에 대한 반응만을 한다는 점에서 편리한 면이 있다. 이는 네트웍 소켓을 윈도우즈의 다른 입력/출력 도구로 다룬 다는 점에서 메시지 핸들링이라는 윈도우 스타일의 OS (윈도우즈, Mac OS, X-Window, Motif) 기본 개념에 충실하다.

그러나 이러한 비동기 통신 방법은 한가지 치명적인 단점이 존재한다.  그것은 바로 위에 장점으로 언급했던 메시지 핸들링으로서 메시지 핸들링은 장점이면서도 치명적인 단점이 되는 것이다.

 

첫째, 메시지 핸들링은 순차적으로 일어난다. , 메시지가 아직 처리중이면 다음 메시지는 기다려야만 한다. 이는 서버 프로그래밍에 있어서는 치명적인 단점이다. 예를 들어 10개의 클라이언트가 동시에 서버에 접속하여 서로 많은 양의 트래픽을 발생시키고 있다고 가정하자. 이때 윈도우즈는 메시지를 순차적으로 처리해야 하기 때문에 아무래도 실시간 응답은 되지 않는다. 만약 유저 프로그램에 버그라도 있어서 메시지 처리가 늦어지거나. 어떤 메시지에서 빠져나가지 못하는 일이 발생한다면 뒤의 소켓을 통한 입력이나 출력은 그대로 막히게 된다. 이러한 현상은 동시접속 클라이언트 수가 많을 수록 현저히 발생한다.

 

둘째, 메시지 핸들링은 윈도우를 가진 프로그램에서만 동작할 있다. 아마도 이걸 읽는 독자는 의아함을 감추지 못할 것이다. 왜냐하면 우리는 윈도우즈 프로그램을 다루고 있기 때문에 윈도우즈 프로그램은 한개 이상의 윈도우를 가지고 있다고 생각 것이기 때문이다. 그러나, 그것은 사실이 아니다. 윈도우즈 프로그램은 윈도우 기반의 프로그램(다이얼로그 박스 기반의 프로그램 포함), 윈도우즈 콘솔 프로그램 그리고 서비스 프로그램등으로 나뉜다. 이중 콘솔 프로그램과 서비스 프로그램은 윈도우를 전혀 가지지 않는다. 일반적으로 서버 프로그램은 서비스로서 작성되는 , 이유는 윈도우에 유저가 로그인 하지 않더라도 시스템이 실행되면 기본적으로 동작하기 위해서이다.

 

위와 같은 이유로 네트웍 서버 프로그램을 작성할 서비스 프로그램으로 만드는 것이 정상적인 방법이다. 이제 강좌에선 다음과 같은 프로그램을 만들고자 한다.

 

테스트 서버 프로그램

-         입력을 그대로 보여주는 echo 서버

-         포트는 그냥 필자의 기분에 따라, 777 사용

-         서비스를 기본 프로그램 골격으로 사용

 

위의 프로그램을 작성하기 위해 강좌는 크게 두가지로 나뉘어 것이다. 먼저 서비스 프로그램을 작성하는 방법을 보일 것이며, 서비스를 등록, 해제하는 방법을 보일 것이다. 후에 멀티 쓰레드를 작성하는 방법을 보이고, 마지막으로 소켓통신을 위한 클래스와 클래스가 서비스 프로그램에서 어떻게 사용되는 가를 보이고자 한다.

 

아무쪼록 짧은 강좌가 API 카페 회원들에게 도움이 되길 바라며 강좌의 저작권은 본인에게 있는 만큼 무단 날름을 자제해 주기 바란다.


- Reference

  http://cafe.naver.com/nevernding