본문 바로가기

iocp9

IOCP 서버 제작 실습 5 Accept 처리를 비동기 I/O로 변경 IOCPServer.h 리슨소켓의 비동기 I/O 작업 완료 여부를 감시해야하므로 BindandListen() 함수에서 CreateIoCompletionPort() 함수를 통해 mListenSocket을 Completion Port에 등록 AccepterThread()에서 클라이언트들을 돌면서 비동기 I/O Accept 작업을 수행 이미 클라이언트가 연결되어있다면(IsConnected() == true) 연결 시도를 하지 않고 넘어감 std::chrono std::chrono::steady_clock은 프로세스마다 독립적으로 측정되는 시간 측정 방법을 사용하여 다른 프로세스나 시스템의 시간 변화에 영향을 받지 않음. 1970년 1월 1일을 기준으로 하는 system.. 2023. 3. 23.
IOCP 서버 제작 실습 4 Send의 구조를 1-Send로 변경 N-Send : 이전 비동기 Send에 대한 완료를 확인하지 않고 곧바로 다음 Send를 호출 1-Send : 이전 비동기 Send에 대한 완료가 확인되었을 때만 다음 Send를 호출 따라서 Send할 데이터를 별도의 버퍼에 보관하는 과정이 필요함 IOCPServer.h stClientInfo 객체를 할당하여 관리하도록 mClientInfos를 vector로 변경 StartServer() 함수 호출시 SendThread를 생성하도록 변경 //Send 쓰레드 std::threadmSendThread; //Send 쓰레드 동작 플래그 boolmIsSenderRun = false; void SendThread() { while(mIsSenderRun) { for (auto.. 2023. 3. 22.
IOCP 서버 제작 실습 3 서버 로직(Send / Recv) 처리를 별도의 쓰레드로 분리 클라이언트의 I/O 관련 함수 및 구조체를 ClientInfo.h로 분리 패킷 관련 정보를 PacketData 구조체에 저장하여 Packet.h로 분리 Main 함수의 흐름을 따라가면서 구조를 설명 #include "EchoServer.h" #include #include const UINT16 SERVER_PORT = 11021; const UINT16 MAX_CLIENT = 100; int main() { EchoServer server; //소켓 초기화 server.InitSocket(); //소켓 서버 등록 server.BindandListen(SERVER_PORT); server.Run(MAX_CLIENT); std::cout Get.. 2023. 3. 22.
IOCP 서버 제작 실습 2 기존에는 데이터 버퍼가 Overlapped 구조체 확장형에 존재(m_szBuf) 비동기 I/O 요청시마다 Overlapped 구조체가 생성됨 그러나 버퍼 크기보다 데이터가 작을 수 있고, 버퍼를 사용하지 않는 I/O 요청이 있을 수도 있음 따라서 현재 구조로는 불필요한 메모리 낭비가 발생할 수 있음 struct stOverlappedEx { WSAOVERLAPPEDm_wsaOverlapped;//OVERLAPPED 구조체 SOCKETm_socketClient;//클라이언트 소켓 WSABUFm_wsaBuf;//Overlapped I/O 작업 버퍼 charm_szBuf[MAX_SOCKBUF];//데이터 버퍼 IOOperationm_eOperation;//작업 동작 종류 }; 따라서 데이터 버퍼를 클라이언트 .. 2023. 3. 21.