본문 바로가기

[ Windows Program ]/Windows API

[WinAPI] The Message Loop 이부분이 바로 메인 메시지 루프(Main message loop) 이다. ( 메시지 큐에서 메시지를 계속해서 꺼내는 반복문을 말한다. ) While문이 반복문이라는걸 다들 알고 있을 것이다.( C/C++ 컨텐츠 참고 ) While문에 0이 들어가면 반복이 끝나는데 저기서 GetMessage 라는 함수를 이용해서 말 그대로 메시지를 받아오는 역할을 한다. 아니 그럼 어디서 메시지를 받아온다는 말인가요? 메시지 큐(Message Queue)에서 메시지를 받아온다. 메시지 큐에 대한 내용은 다음 포스트에서 다루겠다. 그렇게 메시지를 받고 이 GetMessage() 함수가 0을 반환하면 반복이 끝난다는 뜻이다. 이런 작업은 운영체제 자체가 하는것이기에 그냥 동작원리만 이해하면 된다. 이벤트가 발생하면 (키보드나.. 더보기
멀티쓰레드 윈도우즈 소켓 프로그래밍 #5– 멀티쓰레드 프로그래밍 2 4. 멀티쓰레드 프로그래밍 2 실제 에코 서버 제작은 지난 강좌에서 끝났다. 이제 멀티 쓰레드 윈속 프로그래밍을 마무리하며 LXSCK 클래스를 한번 들여다 보고자 한다. 지난 강좌에서 잠시 언급하였 듯이 LXSCK 클래스는 소켓 통신을 위한 클래스이다. 이 클래스는 클래스가 생성되면서 2개의 부가적인 쓰레드를 생성한다. 각자의 쓰레드는 소켓을 읽거나 쓰는 데 쓰이며 소켓에 읽을 데이더가 있으면 버퍼가 허용하는 만큼의 데이터를 가져와 내부버퍼에 쌓아놓는다. 그러면 ReadLine() 또는 ReadDate() 멤버함수가 데이터를 읽어가게 된다. 쓰는 과정도 비슷하다. SendLine() 또는 SendData() 함수가 데이터를 버퍼에 쌓아놓으면 그 내용을 소켓을 통해서 보낸다. 실제적으로 쓰기 작업은 이렇게.. 더보기
멀티쓰레드 윈도우즈 소켓 프로그래밍 #4 – 멀티쓰레드 프로그래밍 3. 멀티쓰레드 프로그래밍 이제 드디어 실제 에코서버에대해 설명해보기로 한다. 이 초간단 서버프로그램은 단순히 입력을 받은 문자열 그대로를 출력해 주는 것으로서 가장 기초적인 서버 프로그램이라고 할 수있다. 이 프로그램을 분석하기 위해 먼저 소스를 참조하기 바란다. 소스를 들여다 보면 이전의 서비스 프로그램 예제에 3개의 클래스가 추가된 것을 알 수 있을 것이다. 각 클래스는 다음과 같다. LXSCK – 윈속 통신을 위한 모듈. 서버/클라이언트에서 사용가능한 공통모듈로서 컨넥션 기능은 없고 통신 기능만 있다. 통신을 위해 2개의 thread(read/write)를 생성하여 사용한다. LXSERVER – 서버용으로 윈속을 초기화하고 클라이언트로부터 접속을 기다린다. 접속이 있을 경우 그 접속을 받아들인 후.. 더보기
멀티쓰레드 윈도우즈 소켓 프로그래밍 #3 – 윈도우즈 서비스 프로그래밍 2. ServiceMain 과 서비스 제어 처리자(ServiceCtrlHandler) 윈도우즈 NT 서비스프로그램은 WinMain() 이외에 2개의 다른 함수를 윈도우에 export 하여야 한다. 그중 하나가 ServiceMain() 함수로서 이 이름은 고정된 것이 아니다. 지난 강좌에서 보았던 WinMain() 함수의 제일 마지막 부분에 서비스 제어자로서 등록하는 부분이 있는 데 이때 ServiceMain() 함수의 이름을 서비스 제어 관리자(SCM-Service Control Manager)에 등록한다. SERVICE_TABLE_ENTRY DispatchTable[] = { { ECHOSVC_NAME, ServiceMain }, { 0, 0 } }; if ( argc < 2 ) { if ( !Star.. 더보기
멀티쓰레드 윈도우즈 소켓 프로그래밍 #2 – 윈도우즈 서비스 프로그래밍 1. 윈도우즈 서비스 프로그래밍 윈도우즈 NT 플랫폼은 서비스라는 프로그램 형태를 지원한다. 이러한 서비스는 시스템 서비스라는 이름으로 불리며 윈도우즈 시스템이 시작하여 종료할 때까지 배후에서 실행되면서 유저 또는 시스템에 특정 서비스를 제공하는 프로그램이다. 이러한 시스템 서비스 프로그램은 운영체제의 일부로서 동작하기 때문에 작성시 큰 주의가 필요하다. 이 장에서는 윈도우즈 시스템 서비스 프로그래밍에 대해 알아보고 간단한 서비스 프로그램을 작성해 보고자 한다. 시스템 서비스 프로그램은 일반적으로 다음과 같은 3개의 export 된 함수를 가지게 된다. 첫번째 함수는 main() 함수로서 일반적인 콘솔 어플리케이션과 동일하다. 즉, 서비스 프로그램은 콘솔 어플리케이션 이기도 하다. Main()는 WinM.. 더보기
멀티쓰레드 윈도우즈 소켓 프로그래밍 #1 흔히 윈도우즈 상에서 소켓 프로그래밍을 한다는 것은 비동기 방식에 의한 윈속 프로그래밍을 의미한다. 비동기 소켓 프로그래밍은 윈도우즈의 기본 디자인 개념에 맞게 유저 프로그램이 소켓을 모니터링 할 필요없이 윈속 모듈의 메시지에 대한 반응만을 한다는 점에서 편리한 면이 있다. 이는 네트웍 소켓을 윈도우즈의 다른 입력/출력 도구로 다룬 다는 점에서 메시지 핸들링이라는 윈도우 스타일의 OS (윈도우즈, Mac OS, X-Window, Motif)의 기본 개념에 충실하다. 그러나 이러한 비동기 통신 방법은 한가지 치명적인 단점이 존재한다. 그것은 바로 위에 장점으로 언급했던 메시지 핸들링으로서 이 메시지 핸들링은 장점이면서도 치명적인 단점이 되는 것이다. 첫째, 메시지 핸들링은 순차적으로 일어난다. 즉, 한 메.. 더보기
비동기소켓 서버구현 그림이 작으니 클릭해서 큰 그림으로 보세요 우리가 만들어 볼 프로그램의 스샷입니다. '서버'와 '클라이언트' 프로그램으로 나뉘어서 따로 구현하게 될겁니다. 이번 장에서는 서버 부분만 알아볼텐데요. 소스는 VC++ 6.0 프로젝트 파일을 압축해서 올렸습니다. 이 글에서는 전체 코드는 다루지 않고 중요한 몇부분만 설명드릴테니 완성코드는 직접 다운받아서 보시고 이해는 여기 글 보면서 하세요. 시작합니다~ 먼저 이 채팅프로그램은 1:1 형식의 프로그램이 아니라 1:다수 형식으로 만들어 졌습니다. 그리고 클라이언트의 데이터는 모두 서버로 전송되게 만들어져 있습니다. 쉽게 말해서 서버가 하나 열려있고 3명의 클라이언트가 그 서버에 접속한 상태라고 가정을 하면 1번 클라이언트가 채팅메시지를 전송할때 직접 2번, 3번.. 더보기
비동기 소켓 - WSAAsyncSelect 안녕하세요? 이번 장에서는 '비동기소켓'에 대해 알아볼까요?. 비동기 소켓이란 말이 생소하실 텐데 쉽게 말해서 메시지방식의(이벤트) 소켓을 뜻하는 말입니다. Win32에선 DOS나 UNIX와는 달리 이벤트성 메시지를 통해 프로그램이 제어되죠? 마찬가지예요. 일반 소켓함수는 대부분 UNIX와 같은 순차적으로 실행이 되지만 비동기소켓은 윈도우와 같이 메시지방식으로 진행된다고 생각하시면 됩니다. 우리 저번에 블록함수에 대해서 잠깐 알아봤죠? 다시한번 개념을 정리해 드리자면.. '블록함수란 특정이벤트가 발생하기 전까지 리턴하지 않는 함수' 라고 정의할 수 있겠네요. 아래는 블록함수의 주요 목록들 입니다. accept, connect, send, recv 이외에도 몇가지 더 있지만 그건 레퍼런스를 참고하시고 저 .. 더보기
데이터 전/수송 함수인 send/recv 우린 이 전장까지 소켓을 생성하고 바인딩하여 클라이언트의 연결요청을 수락하는 방법까지 배웠습니다. 이제 실질적으로 중요한 데이터 전송, 수신 함수인 send 함수와 recv 함수를 배울겁니다. send 함수는 데이터를 해당 소켓으로 보내는 함수이고 recv 함수는 해당 소켓으로부터 데이터를 받는 함수입니다. 이 단원 마지막에는 간단한 에코서버와 아직 배우진 않았지만 클라이언트가 연결을 요청하는 프로그램의 소스를 코딩해 볼겁니다. 중요한 부분이니 눈 크게 뜨고 따라오세요. 우선 두 함수의 원형부터 살펴볼까요? int send( SOCKET s, const char* buf, int len, int flags ); int recv( SOCKET s, char* buf, int len, int flags );.. 더보기
클라이언트의 연결을 처리하는 accept 함수 드디어 중요한 accept 함수를 다루게 되었습니다. 이 함수는 TCP연결방식에서 서버측에서만 쓰이는 함수입니다. 클라이언트에서는 사용하지 않는 함수죠. 이 함수가 호출되면 클라이언트의 연결요청을 기다렸다가 요청을해오면 수락해서 서버-클라이언트간의 연결 고리를 만드는 함수입니다. 전에 TCP를 전화기에 비유했는데 이 함수를 전화기에 비유해보자면 '전화가 걸려오면 전화를 받는 기능' 을 한다고 말할 수 있습니다. 물론 여기에서는 클라이언트가 연결요청을 하기전에 accept 함수를 호출한 상태여야 하겠지만 말예요. 함수 원형을 살펴볼까요? SOCKET accept( SOCKET s, struct sockaddr* addr, int* addrlen ); 우선 리턴타입이 SOCKET형입니다. 이 함수는 연결요청.. 더보기