IOCP와 버퍼의 관계
Posted 2012. 10. 17. 12:16IOCP는 data를 전송하거나 수신할때 WSAOVERLAPPED 구조체 및 버퍼를 생성하여
넘겨주어야 하는데 클라가 수천개나 되는 경우 시스템 입장에서 보면 메모리를 너무 많이 잡아 먹는다.
NETWORK PROGRAMMING for Microsoft WINDOWS책에는.
대량 연결용 서버의 경우 0 SIZE 버퍼를 사용하여 IO작업을 요청하라. 고 되어있다.
0 SIZE 버퍼를 사용하면 메모리 사용은 현격히 줄어든다.
wsabuf.buf = NULL; << 버퍼를 제공하지 않는다.
wsabuf.len = 0; << receive할 최대 크기를 0로 만든다.
flag = 0;
이러면 해당 소켓으로 데이터가 들어오면 IOCP는 worker thread를 깨워 처리하도록 한다.
그런데 문제는 버퍼가 없으니 받은 데이터가 없다는 거다.
worker thread에선
일반적으로 bytes 값이 0 이면 연결이 끈긴 것으로 처리했지만 0 size버퍼를 사용했을 경우는
무조건 bytes값이 0으로 리턴된다.
이 경우 끈긴 것으로 판단하지 말고 일단 데이터가 들어온 것으로 파단해야 한다.
버퍼를 0로 만들었기 때문에 IOCP는 소켓으로 수신된데이터를 아직 손대지 않은 상태다
이것을 알아 낼 때엔 IOCP를 사용하지 않은 일반적인 socket프로그램으로 읽으면 된다.
nonblocking방식으로 WSAEWOULDBLOCK이 될때까지 recv를 하면 된다.
(block일경우 프로토콜의 정의된 데이터만큼 recv 하면되고..)
이렇게 데이터를 모두 읽어서 처리 했다면 WSARecv를 사용하여 IOCP에게 요청하면 된다.
으흠..
받는쪽은 일단 버퍼 크기를 좀 크게 설정해 준다.
받는쪽이 0이 되버리면 send에서 에러가 나는 이유기도 하고 보냇는데 못받으면 그게
더 큰 문제이기 때문에..
- Filed under : Server/IOCP와 Socket버퍼 관련