이전게시판/C, C++
IOCP 소켓 종료 상황
ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ
2016. 4. 21. 11:50
IOCP 소켓 종료 상황
소켓이 CloseSocket으로 안전하게 끊어졌는지, 아닌지에 따라
정상종료. 비정상종료로 나눌 수 있다.
정상종료는 GetQueuedCompletionStatus 완료된 바이트 수가 0일 때..
비정상 종료는 GetQueuedCompletionStatus 함수의 리턴값이 0이고 WSAGetLastError값이 64 이다.
그리고 IO도 NULL이 아니다.
나는 이렇게 사용하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | int err = WSAGetLastError(); if(NULL == userInfo) { PrintColor(YELLOW, "userInfo는 NULL! h \n"); } else if((!result && WSAGetLastError() == 64)&& ioInfo != NULL) // 비정상 종료 { printf("bytesTrans가 0이라 종료합니다 ID:%d \n", userInfo->id); closesocket(sock); int id = userInfo->id; EnterCriticalSection(&cs); UserList.RemoveKey(userInfo->id); SAFE_DELETE(userInfo); SAFE_DELETE(ioInfo); LeaveCriticalSection(&cs); printf("접속자 %d가 나갔습니다. \n", id); PrintColor(YELLOW, "접속자 나갔습니다. \n"); continue; } else if(!bytesTrans) { PrintColor(YELLOW, "정상적인 종료! \n"); } | cs |