GetQueuedCompletionStatus 가 2번 오는 현상??
글쓴이: jic5760 / 작성시간: 화, 2017/09/19 - 10:41오후
안녕하세요.
IOCP을 이용해 NamedPipe소스를 짜고 있습니다.
그런데 좀.. 이상한 문제가 있어 질문드립니다.
NamedPipe Client 4개를 만들어놓고 연결하고 일정시간후에 연결을 끊는 작업을 하며 테스트를 하고 있습니다.
(그 중간에는 데이터 송신도 합니다.)
그런데 client들을 CloseHandle를 순차적으로 하는데 처음 4번까지는 서버쪽 GetQueuedCompletionStatus에서 ERROR_BROKEN_PIPE을 리턴하고 클라이언트 정보를 정리하는 작업을 합니다.
그런데 의문의 5번째 GetQueuedCompletionStatus응답이 발생합니다...
cbEventErrorHandler: 015BB9E0: 109 ClientDel: 232 / internal:c000014b cbEventErrorHandler: 015BBF18: 109 ClientDel: 252 / internal:c000014b cbEventErrorHandler: 015BC450: 109 ClientDel: 264 / internal:c000014b cbEventErrorHandler: 015BC988: 109 ClientDel: 276 / internal:c000014b cbEventErrorHandler: 015BC988: 109 ClientDel: 276 / internal:c000014b
109 란 숫자는 GetQueuedCompletionStatus의 LastError값입니다. (ERROR_BROKEN_PIPE)
internal는 ReadFile을 하던 Overlapped 객체의 Internal값이구요.
대체 같은 결과가 왜 2번 오는지 모르겠습니다....ㅠㅠ
위에 클라이언트 4개라고 했는데 3개로 해도 이벤트가 4개가 오네요..
이런 경험 해보신 분 계신가요? 뭐가 문제일까요?
소스는 복잡해서 첨부하지 않았습니다..
아 참고로 지금 Worker Thread는 1개입니다.
테스트해보니 클라이언트에서 데이터를 전송하지 않으면 문제가 발생하진 않네요..
Forums:
자문자답입니다...
ReadFile의 Return이 TRUE일 경우 Queueing안되는줄 알고 즉시 처리 후 다시 ReadFile을 하도록 했는데 이게 문제였네요...
ReadFile가 True을 Return해도 GetQueuedCompletionStatus에서 처리가 가능하군요...
댓글 달기