Post

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


▲ top