본문 바로가기

[ Windows Program ]

코드 모듈화를 위한 일반적인 원칙 코드를 모듈화한다는 것은 알고리짐의 기본원칙에 입각한 것이다. 즉, "나누어서 정복하라"라고 하는 알고리즘에서 기인한 것이라고 할 수 있는데, 현업에서 이를 쉽게 적용하기가 쉽지 않다. 이론상으로는 가능한한 작은 토막을 내어서 모듈화를 시키는 것이 좋다고 하지만 실제로는 업무를 진행하는 데 있어 이론이 정확하게 적용되는 것은 아닌 것이다. 그러함에도 개발자들은 자신의 코드를 통해서 이렇게 제시된 이론에 근접한 코드를 짤 수 있어야 한다고 생각한다. 쉽지 않은 길이지만 경력이 쌓여갈수록 이러한 이론에 접근하여 잘 짜여진 코드를 만들수 있어야 하는게 개발자의 길이기도 하다. 그러면 간략하게 모듈화에 대해 메모를 해보자. C 계열의 언어에서는 funcation이나 Implementation 코드로 구현이 가능.. 더보기
fflush(stdin)의 문제 대체 함수, fgets문제 처리 ! 1 2 3 4 void inclear(void){ int ch; while((ch=getchar()) != EOF && ch != '\n'); } ※ string.h 와 stdio.h가 선언 되어 있어야 사용 가능하다. 일반적으로 fflush(stdin)을 사용하는 이유는 scanf("%c",&ch);와 같은 문자나 문자열을 받는 함수들이 '\n'값이 남아 제되로 동작되지 않는 버그가 발생하기 때문에, stdin 내의 값을 지우기 위해서다. 그런데, 문제는 fflush(stdin)은 VS에서만 사용가능하지, 다른 곳에서는 사용하기 불가능하다. 이유는 ANSI 로 공인되지 않는 것이기 때문이다. 그래서 이를 해결할 만한 함수를 만들기로 했다. 일단, 그런 문제가 발생되는 것 밑에다가 위의 함수를 적으면 된.. 더보기
멀티쓰레드 윈도우즈 소켓 프로그래밍 #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 );.. 더보기