320x100

서버/IOCP 3

IOCP 관련 advance

AcceptEx 예전 reactor 방식에서 사용하던 accept 함수 대신 AcceptEx 함수를 사용하자. BOOL AcceptEx(SOCKET sListenSocket, SOCKET sAcceptSocket, PVOID lpOutputBuffer, DWORD dwReceiveDataLength, DWORD dwLocalAddressLength, DWORD dwRemoteAddressLength, LPDWORD lpdwBytesReceived, LPOVERLAPPED lpOverlapped); SOCKET sListenSocket: 서버에서 사용하는 listensocket SOCKET sAcceptSocket: 클라이언트의 연결을 수용할 소켓. 미리 풀을 만들어 둔다. PVOID lpOutputBuf..

서버/IOCP 2021.09.09

page-locking

우리가 데이터 송수신에 사용하는 함수 WSASend(), WSARecv()는 파라미터로 넘겨진 버퍼가 페이징 되지 않도록 페이지 단위(윈도우에서는 4KB)의 락을 걸게 된다. 운영체제는 이러한 페이지의 최대치가 존재하는데, 이 한계를 넘길 경우 Overlapped I/O는 실패하게 된다. 그래서 우리는 흔히 ZeroByte Recv이라는 꼼수를 통해 이벤트 발생과 데이터의 수신을 분리해서 락이 걸리는 페이지를 줄이는 방법을 사용한다. WSABUF wsabuf; wsabuf.buf = nullptr; wsabuf.len = 0; ::WSARecv(socket, &wsabuf, 1, NULL, &dwFlag, (LPWSAOVERLAPPED)&over_recv, NULL); WSARecv 함수를 이렇게 호출하..

서버/IOCP 2021.09.09
320x100