bdfgdfg

IOCP 세션 삭제 처리 본문

게임프로그래밍/오류해결등 기타

IOCP 세션 삭제 처리

marmelo12 2022. 1. 19. 16:21
반응형

세션 A의 작업이 완료 큐에 남아있을 때 세션을 삭제하면 어떻게 될까.

나는 WSARecv,WSASend를 소켓 대상으로 했을 때 WSAGetLastError가 PENDING이 아니라면 바로 세션을 끊어버렸었다.

 

여기서의 문제는 세션이 가르키는 힙 메모리 영역의 메모리는 지워졌지만, Session이 그 메모리를 가리키는 주소 값은

삭제를 할 당시에 nullptr로 밀어도 원래 가리키던 주소 값으로 반환해준다. 

 -> CP객체에 소켓과 완료키를 등록할 때 복사를 하는 방식인듯하다.

 

심지어 GQCS함수의 return값도 true, transferrbytes도 완료가 되었을 때의 송수신된 바이트가 기록되어있고 overlapped도 살아있다. 그렇기에 일반적인 체크로는 Session의 연결을 끊어버렸을 때 위와 같은 상황에서 옳은 데이터라 판단하고 진행해버린다.

  -> 지워진 메모리를 대상으로 무언가를 처리하니 당연히 크래시가 터짐.

 

별의별 방법을 시도해보다가 온라인 게임 서버(저자 강정중)의 Overlapped I/O 요청 횟수를 센다는 것에 아이디어를 얻어 해결.

즉 Session의 연결이 끊어졌을 때 WSARecv, WSASend함수는 PENDING이 아닌 에러를 뱉는데, 여기서는 bool flag를 하나 두고 flag를 false로 바꾼 다음 해당 세션의 모든 I/O 작업을 무시해버리고, 완료큐에서 I/O작업을 모두 빼왔을 때 flag를 검사해보고 false라면 지워버리는 방식을 택했다.

 

완벽한 방법인지는 모르겠지만 일단 해결은 되었음.

 

+ GQCS함수의 return값이 false로 뜨지만 딱히 다른 문제는 없었음. GetLastError를 통해 오류코드를 확인해보니 64라는 값이 나옴. -> 구글에 검색해보니 64라는 에러코드는 

위의 에러코드였는데 지정한 네트워크 이름을 더 이상 사용할 수 없다는 에러.

진짜 에러는 아니기에 64가 아닐때만 따로 에러처리를 해야한다.

 -> 아마 연결이 끊겼음을 false로 반환처리도 해주는 듯하다. 

 -> 하지만 계속 처리해주는 건 아니고 가끔씩 이런 에러코드를 내뱉었음.

  --> 따로 확인하고 처리.

 

반응형

'게임프로그래밍 > 오류해결등 기타' 카테고리의 다른 글

메모리 가비지  (0) 2022.01.18
Comments