Completion Port의 생성

Posted 2012. 8. 13. 22:48

IOCP에선 완료된 IO의 정보가 Completion Port 오브젝트(이하 CP 오브젝트)라는 커널 오브젝트에 등록된다.

" 이 소켓을 기반으로 진행되는 IO의 완료상황은 저 CP오브젝트에 등록해 주세요 " 라는 요청의과정이 선행되어야 한다.

이를 가리켜 소켓과 CP오브젝트와의 연결 요청 이라 한다.

때문에 IOCP 모델의 서버 구현을 위해서는 다음 두 가지 일을진행해야 한다

1.Completion Port 오브젝트의 생성

2.Completion Port 오브젝트와 소켓의 연결

이떄 소켓은 반드시 Overlapped 속성이 부여된 소켓이여야 함.

 

생성과 연결 함수

HANDLE CreateIoCompletionPort(

HANDLE FileHandle,

HANDLE ExistingCompletionPort,

ULONG_PTR CompletionKey,

DWORD NumberOfConcurrentThreads

);

-> 성공시 CP 오브젝트의 핸들, 실패시 NULL 반환

지금은 생성이니까 생성시점으로 설명)

  1. 입출력 완료 포트를 새로 생성하고
  2. 소켓과 입출력 완료 포트를 연결한다. 연결하면 이 소켓에 비동기 입출력 결과가 입출력 완료 포트에 저장된다.

 

FileHandle : 새로운 입출력 완료포트를 생성할때는 INVALID_HANDLE_VALUE를 전달

ExistingCompletionPort : 파일 또는 소켓과 연결할 입출력 완료 포트 핸들. 새로운입출력 완료 포트를 생성할땐 NULL 전달

CompletionKey : 입출력 완료 패킷에 들어갈 부가적인 정보를 32비트 값을 줄수있다. 생성시는 0을 전달

NumberOfConcurrentThreads : 동시에 실행할수있는 작업자 스레드의 개수. 0을 사용하면 자동으로 CPU개수와 같은수로 설정.

                                         최대설정수는 2.

 

ex) HANDLE hCpObject;

......

hCpObject = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 2 );

 

SOCKET sock;

HANDLE hResult = CreateIoCompletionPort( ( HANDL)sock, (DWORD)sock, 0 );

 

 

결론은 생성할땐 생성옵션에 맞춰서 함수를 호출하고 연결할땐 연결옵션에 맞춰서 함수를 호출.

 

즉.. 만들때 한번호출하고.. 이미 있는걸 연결할때 또 호출하고..

 

 

 

 

 

 

 

'Server > IOCP' 카테고리의 다른 글

GetQueuedCompletionStatus() 함수  (0) 2012.08.13
Completion Port 오브젝트와 소켓의 연결  (0) 2012.08.13
IOCP  (0) 2012.08.13