본문 바로가기

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

IOCP 서버 제작 실습 10 추가로 구현해야하는 내용들 정리 기능 추가 채팅방에 속한 유저 리스트 기능 귓속말 기능 채팅방 방장, 강퇴 기능 Redis DB에 저장된 비밀번호 변경 최적화 좀 더 발전된 함수들 사용 (GetQueuedCompletionStatusEx 함수 등) 서버 코드 내에서 각종 수치(최대 클라이언트 수 등)들을 지정하는 것이 아니라 입력받도록 설정 동적 할당 최소화 Lock 최적화 구조 버퍼 구조를 어떻게 하면 더 잘 짤 수 있을지 고민 프로그램을 부분별로 나누어 정적 라이브러리로 활용 클라이언트 Reference 클라이언트가 아닌 나만의 클라이언트 만들어보기 서버의 스트레스 테스트가 가능하도록 더미 클라이언트 구현 2023. 3. 27.
IOCP 서버 제작 실습 9 추가로 로그아웃 기능을 구현 Logout 로직 기본적인 작동 방식은 Login과 동일 [PacketManager] LOGOUT_REQUEST 패킷을 받아 ProcessLogout() 함수 호출, REQUEST_LOGOUT Task를 생성 [RedisManager] REQUEST_LOGOUT Task를 받아 ProcessLogout() 함수 호출, RESPONSE_LOGOUT 패킷을 생성 [PacketManager] REQUEST_LOGOUT 패킷을 받으면 ProcessLogoutDBResult() 함수를 호출 유저가 Room에 들어가있는 상태라면 RoomManager의 LeaveUser() 함수를 호출하여 Room에서 제거 유저 정보도 UserManager의 DelUser() 함수를 호출하여 리스트에서 .. 2023. 3. 27.
IOCP 서버 제작 실습 8 Room을 생성하여 채팅을 할 수 있도록 구현 Room 생성 [PacketManager] CreateRommManager() 함수에서 RoomManager 객체 생성 [RoomManager] Init() 함수에서 maxRoomCount 만큼의 Room 객체를 생성해두고 추후 사용 Room 입장 [PacketManager] ProcessPacket() 함수에서 확인한 패킷 데이터의 Id가 ROOM_ENTER_REQUEST일 경우 [PacketManger] ProcessEnterRoom() 함수에서 응답으로 보내줄 패킷을 생성 유저가 존재하지 않는 경우 에러코드로 ENTER_ROOM_NOT_FIND_USER를 가진 응답을 전송 로그인하지 않은 유저의 요청일 경우 에러코드로 ENTER_ROOM_INVALID_.. 2023. 3. 27.
IOCP 서버 제작 실습 7 DB로 Redis를 연동하여 로그인 작업을 구현 PacketManager의 Run() 함수 실행시 RedisManager 객체를 생성하여 Init() 및 Run() 함수 실행 Connect() 함수에서 Redis DB와 연동한 후 DB 작업을 수행하는 쓰레드를 생성하여 ProcessTask() 함수 실행 ProcessTask() 함수에서는 deque에 RequestTask가 있다면 해당 Task에 맞는 작업을 수행 Login 로직 [PacketManager] 패킷 처리 쓰레드의 ProcessPacket() 함수에서 수신된 패킷 데이터를 확인하여 패킷Id가 LOGIN_REQUEST일 경우 ProcessLogin() 함수 실행 [PacketManager] ProcessLogin() 함수에서 서버의 최대 접속.. 2023. 3. 25.