최신 Windows SDK의 IOCP GetQueuedCompletionStatus, CreateIoCompletionPort 함수의 인자 타입 변경점
GetQueuedCompletionStatus
이전 사용 코드
//CompletionKey를 받을 포인터 변수
stClientInfo* pClientInfo = NULL;
//함수 호출 성공 여부
BOOL bSuccess = TRUE;
//Overlapped I/O작업에서 전송된 데이터 크기
DWORD dwIoSize = 0;
//I/O 작업을 위해 요청한 Overlapped 구조체를 받을 포인터
LPOVERLAPPED lpOverlapped = NULL;
while( m_bWorkerRun )
{
//////////////////////////////////////////////////////
//이 함수로 인해 쓰레드들은 WaitingThread Queue에
//대기 상태로 들어가게 된다.
//완료된 Overlapped I/O작업이 발생하면 IOCP Queue에서
//완료된 작업을 가져와 뒤 처리를 한다.
//그리고 PostQueuedCompletionStatus()함수에의해 사용자
//메세지가 도착되면 쓰레드를 종료한다.
//////////////////////////////////////////////////////
bSuccess = GetQueuedCompletionStatus( m_hIOCP,
&dwIoSize, // 실제로 전송된 바이트
(LPDWORD)&pClientInfo, // CompletionKey
&lpOverlapped, // Overlapped IO 객체
INFINITE ); // 대기할 시간
위 코드를 컴파일 하면 아래와 같은 에러가 나온다
심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태 오류 C2664 ‘BOOL GetQueuedCompletionStatus(HANDLE,LPDWORD,PULONG_PTR,LPOVERLAPPED *,DWORD)’: 인수 3을(를) ‘LPDWORD’에서 ‘PULONG_PTR’(으)로 변환할 수 없습니다. 02_IOCP e:\github\codes_book_onlinegameserver\02_iocp\iocompletionport.cpp 356
아래처럼 수정해야 한다.
bSuccess = GetQueuedCompletionStatus( m_hIOCP,
&dwIoSize, // 실제로 전송된 바이트
(PULONG_PTR)&pClientInfo, // CompletionKey
&lpOverlapped, // Overlapped IO 객체
INFINITE ); // 대기할 시간
CreateIoCompletionPort
이전 사용 코드
HANDLE hIOCP;
//socket과 pClientInfo를 CompletionPort객체와 연결시킨다.
hIOCP = CreateIoCompletionPort((HANDLE)pClientInfo->m_socketClient
, m_hIOCP
, reinterpret_cast<DWORD>( pClientInfo ) , 0);
수정된 코드
hIOCP = CreateIoCompletionPort((HANDLE)pClientInfo->m_socketClient
, m_hIOCP
, (ULONG_PTR)( pClientInfo ) , 0);
if( NULL == hIOCP || m_hIOCP != hIOCP )
{
printf("[에러] CreateIoCompletionPort()함수 실패: %d",GetLastError() );
return false;
}
MS Docs의 CreateIoCompletionPort
MS Docs의 GetQueuedCompletionStatus
GetQueuedCompletionStatus 함수의 새 버전은 GetQueuedCompletionStatusEx 이다.
이 글은 2019-10-17에 작성되었습니다.