|
빌더에 관련된 질문은 아니고 ACE IOCP에 관련된 질문입니다.
IOCP에서 비동기 입출력 기본적인 개념인데 이 문제가 어떻게 되냐에 따라 서버구현이 완전히 달라지거든요.
IOCP에 관련된 서버 구현이 처음이라 IOCP Sample소스를 받았는데 무척 헷갈리는점이 있습니다.
같은 입력 스트림에 입력 버퍼 A, B가 있습니다.
A 는 1024바이트.
B 는 128바이트.
(사실 바이트는 그리 중요하지 않고 완료 이벤트 발생 순서가 중요합니다.)
처음 비동기 입력스트림에 A를 1024바이트를 읽어라고 명령을 주었습니다.
두번째 다시 입력스트림에 B를 128바이트를 읽어라고 명령을 주었습니다.
이 경우 비동기 읽기 순서는 A, B였습니다만, 완료이벤트는 B,A 순으로 올 수가 있는지요?
반대로 쓰기 역시 같은 문제입니다.
비동기 출력스트림에 A를 쓰라고 먼저 했고, 다시 B를 쓰라고 했습니다. 이때 쓰기 완료 이벤트는 B,A의 순서로 올 수 있는지요?
위의 모든 경우 입출력스트림은 같은것에 상태는 정상적이라고 가정했을때 이야기입니다. 스트림이 끊어졌거나 이상이 생겼을 경우는 예외로 A,B의 순서와는 상관 없이 남아있는 버퍼를 몽땅 비우고 입출력 동작중인 상태는 모두 cancel해야 겟죠.
위에서 제가 받았다고 하는 Sample소스에선 완료 이벤트가 B가 A보다 먼저 올 수 있다고 가정을 하고 소스가 짜여져 있더군요. 문제는.. 이 Sample 소스를 개발하신분이 테스트를 한다고 했는데 동시접속등 네트워크 환경은 테스트를 안해보신건지 하나일때는 위의구조로 잘 돌아가는데 테스트로 클라이언트 수십개를 동시에 물리고 데이터를 랜덤하게 보내고 소켓도 랜덤하게 끊어지게하고, 다시 물리고 하는것을 반복시켰더니 위 부분 Logic에서 문제가 생겼습니다.
가만히 쳐다 보다가..... 같은 스트림에 먼저 쓴것이 나중에 완료할 수도 있다는.. 좀 이해하기 힘든점이 있어서 잘라내 볼까 생각중이라 질문 올립니다.
그럼 모두 건강하세요.
|