본문 바로가기

개인공부/IOCP 서버 제작 실습10

IOCP 서버 제작 실습 6 서버의 종류를 에코 서버에서 채팅 서버로 변경 패킷과 유저를 관리하기 위한 PacketManager와 UserManager 및 User 클래스를 추가 네트워크 라이브러리(IOCPServer.h / ClientInfo.h / Define.h) 및 main.cpp는 기존과 동일(단, EchoServer 클래스의 명칭이 ChatServer로 바뀜) 데이터 패킷 수신 로직 [ClientInfo] 클라이언트 등록시 + 비동기 I/O Recv 작업 완료시 BindRecv()에서 WSARecv() [IOCPServer] Worker 쓰레드에서 비동기 Recv 작업 완료 감지 [ChatServer] OnRecieve() [PacketManager] ReceivePacketdata() [User] SetPacketDat.. 2023. 3. 23.
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.