Completion Port의 생성
Posted 2012. 8. 13. 22:48IOCP에선 완료된 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 반환
지금은 생성이니까 생성시점으로 설명)
- 입출력 완료 포트를 새로 생성하고
- 소켓과 입출력 완료 포트를 연결한다. 연결하면 이 소켓에 비동기 입출력 결과가 입출력 완료 포트에 저장된다.
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 |
- Filed under : Server/IOCP