IOCP와 이벤트를 연결시키면 우리는 입출력이 완료 되는 시점에서 이벤트를 발생시킬 수 있다.
IOCP와 이벤트 핸들을 연결시키려면 우선 소켓을 만들고 입출력 완료 포트를 생성해야 한다.
함수 :CreateloCompletionPort()
설명:이 함수는 IO Completion port를 생성하여 핸들 값을 반환한다.
원형: HANDLE CreateloCompletionPort(
HANDLE FileHandle,
HANDLE ExistiongCompletionPort,
DWORD completionKey,
DWORD NumberOfConcurrentThreads);
리턴값:성공하면 I/O Completion Port의 핸들 값을 리턴하고, 실패할 경우 NULL을 리턴한다.에러의 상태를 확인하려면 GetLastError()함수를 호출하면 된다.
1.FileHandle
Overlapped I/O completion을 연결할 파일 핸들.CreateFile()함수를 이용할 경우에는 핸들을 얻기위해 반드시 FILE_FLAG_OVERLAPPED 플래그를 지정해야한다.
2.ExistinggCompletionPort의 핸들. 이 파라미터에 이미 존재하는 Completion Port를 지정하면 해당 핸들로 연결된다. 새로 생성하고 싶다면 이 인자에 NULL을 지정한다.
3.CompletionKey
완료키를 지정한다. 모든 I/O completio Prot는 CompletionKey를 포함한다.
4.NumberOfConcurrentThreads
동시에 발생을 허용하는 쓰레드의 숫자를 지정한다.
Completion Port 생성에 성공했다면 이제 GetQueuedCompletionStatus()함수를 호출해서 이벤트를 기다린다. 만일 이벤트가 발생하지 않는다면 이 함수는 블로킹 상태로 있을 것이며, 이벤트가 발생한다면 블로킹을 해제한다. 마치 WaitForMultipleObject()함수와 같은 역활을 수행하는것이다.
함수:GetQueuedCompletionStatus()
설명:완료 포트 (Completion port)의 상태를 얻어온다.
원형: BOOL GetQueuedCompletionStatus(
HANDLE CompletionPort,
LPDWORD lpNumberOfBytesTransferred,
LPDWORD lpCompletionKey,
LPOVERLAPPED *lpOverlapped
DWORD dwMilliseconds);
리턴 값: 성공할 경우 TRUE를 , 실패할 경우 FALSE를 리턴한다. 완료 포트의 상태는 네 번째 인자인 lpOverlapped에 리턴한다.
1.CompletionPort
이벤트 발생을 대기할 I/O Completion port의 핸들.
2.lpNumberOfBytesTransferred
입출력된 데이터의 크기를 리턴 받을 변수
3.lpCompletionKey
지정된 CompletionKey. 이 Key 값으로 누구에게 (어떤 파일로 )데이터가 입출력되었는지를 알수있다.
4.*lpOverlapped
입출력 결과를 리턴 받을 OVERLAPPED 구조체의 포인터.
5.dwMilliseconds
밀리세컨 단위의 숫자로 Completion port에 패킷 전달이 완료되기를 기다리는 시간이다. 즉 이 인자로 주어진 시간이 지나면 블로킹이 해제 된다.
댓글 없음:
댓글 쓰기