음...
IOCP 써보신 분들 계시면...
조언좀 부탁드립니다. ㅡㅡ;
(질답 게시판에 올리긴 좀 그런 내용이라 여기에 올립니다. ㅡㅡ;)
우선... IOCP를 이용한 서버 라이브러리를 빌더에 있는 기본소켓(TServerSocket)과 거의 똑같이
만드는 데는 성공했습니다.
그런데... 문제가... 바로 버퍼링인데요...
하나의 send가 완료되기 전에 계속해서 send를 요청할 경우가 있을 수 있습니다.
그래서 생각한게... send용 큐를 만드는건데...
(send 완료 이벤트가 발생하면 send 큐를 찾아보고, 다시 전송 요청하고...
큐가 완전히 비워질 때까지 이걸 반복하는...)
일단 구조는 이렇게 잡혔는데...
구현을 하려니 생각해봐야할 게 상당히 많더군요 ^^
일단... IO 컨텍스트는...
class CIoContext : public CVirtualMemory {
public:
WSAOVERLAPPED Overlapped;
WSABUF wsaBuffer;
char szBuffer[1024 * 5];
unsigned int unBytesTransferred; // Send/Recv 바이트 수
unsigned int unTotalBytes;
public:
CIoContext(void);
~CIoContext(void);
};
이렇게 정의했습니다. CVirtualMemory는 new하고 delete를 VirtualAlloc, VirtualFree로
재정의한 것일뿐 별 의미는 없구요.
제일 간단하게는 Send용 CIoContext를 list로 만들어서... 관리하는 것이고...
또 다른 방법은 Send용 CIoContext는 하나이고, szBuffer를 가변으로 늘였다 줄였다
하는 방법... 등등 방법은 꽤 많을 것 같습니다.
그러나... IOCP 서버 엔진이니... 조그만 부분이라도... 서버의 성능에 미치는 영향을
최소화 하고 싶습니다. Send IO Context를 어찌 관리하는게 맞는건지...ㅠ.ㅠ
PS. 완성해보고 쓸만하다고 생각되면... 자료실에 올리겠습니다. ^^
|