비동기 처리가 필요한 곳곳에 징하게 울궈먹고 있는 TIOCPHandler 라는 물건입니다.
이기탁님의 IOCP 강좌를 공부하면서 제 프로젝트에 써먹기 좋게 구성해 둔 녀석이죠.
(실제 써먹고 있는 물건은 여기에 이런저런 처리가 추가되었습니다만, 그건 회사물건이라...)

TIOCPHandler는 복잡하게 생각하지 마시고 그저 IOCP 를 이용한 쓰레드 풀이라고 여기시면 편합니다.
(사실 IOCP 가 이미 멋진 쓰레드 풀 모델이지만...)

이 물건은 두가지 비동기 처리에 대한 시나리오를 가정하고 만들어졌습니다.

첫번째는 특정 서버에 연결을 유지하고 별도의 작업 쓰레드에서 작업을 위임받아 처리하는 경우 입니다.
대표적으로 DB처리 같은 것을 예로 들 수 있겠네요. TIOCPSession 을 상속받아 처리객체를 만들고
거기서 발생하는 IOCompletion 이벤트를 사용하게 됩니다. 소켓을 예로 들면, 쓰레드의 갯수와 소켓의 갯수가
동일할 때 사용하게 되죠. 주로 클라이언트 모델로 동작할 때 많이 써먹습니다.

두번째는 다수의 클라이언트 연결 같은 상황입니다. 쓰레드의 갯수보다 연결갯수가 많을 때 사용합니다.
TIOCPHandler의 생성자로 nil 을 주고 실제로 IO가 발생할 때 발생하는 OnIOCompletion 이벤트에서
키값, 또는 오버랩드 구조체에 지정한 "식별자"로 어플리케이션을 제어하는 경우입죠.
임의갯수의 연결을 처리하는 소켓서버, 또는 파이프서버에 적합합니다.

구현에 대한 설명은 다음에 시간이 나면 하도록 하구요, 일단 코드부터 올립니다.


파일의 압축을 풀면 두 개의 폴더가 나옵니다.

** 01. IOCP핸들러

이 물건을 만들기 위한 테스트 프로그램입니다.
쓰레드를 3개씩 깨우므로 듀얼코어 이상에서는 무작위로 발생하는 이벤트를 확인할 수 있습니다.


** 03. 파이프 입출력

두번째 시나리오에 대한 예제입니다. 파이프 입출력 서버입니다.
클라이언트 만들기가 귀찮아서 자료실에 dJiNNi 님이 올리신 파이프 컴포넌트 예제프로그램을
그대로 사용했습니다. 자료실에서 "pipe"로 검색하시면 나오는 "pipe 컴포" 게시물에서
21_JnPipe.zip 을 내려받아 그 안에 PipeClient.exe를 사용해 접속하세요. 링크는 다음과 같습니다.
http://www.delmadang.com/community/bbs_view.asp?bbsNo=21&bbsCat=0&st=S&keyword=pipe&indx=209315&keyword2=&page=1
클라를 여러개 띄워서 연결 해 보세요.


02번 예제는 IOCPSession 을 이용한 DB제어 테스트이고 첫번째 시나리오에 대한 예제인데,
예제로 올리기 위해서는 DB도 설정해야 해서 생략합니다.

제 구현이 오히려 IOCP에 대한 편견을 만들까봐 조심스럽네요~~ ^^;;
모쪼록 희멀건 국물에서도 건더기만 건져드시는 지혜가 함께 하시기를 바랍니다.

출처 : 델마당 자료실 과 델마당 어디선가.(오랑캐꽃님)

+ Recent posts