파일 목록
- IocpCore.cpp/h : IocpCore 형 글로벌 변수 GIocpCore 선언.
- IocpEvent.cpp/h
- Listener.cpp/h
- NetAddress.cpp/h
- Session.cpp/h
- SocketUtils.cpp/h
- Service.copp/h
클래스 목록
- IocpCore : Completion Port(이하 CP) 의 Handle(_iocpHandle)을 멤버로 가지고 있으며, 이를 관리하는 클래스.
- 생성자 : CreateIoCompletionPort 함수로 CP를 생성, _iocpHandle에 할당.
- GetHandle() : _iocpHandle을 반환
- Register() : CreateIoCompletionPort 함수로 Listener 소켓과 CP를 연결해주는 함수
- Dispatch() : GetQueuedCompletionStatus함수로 IO작업이 완료될 때까지 대기하다가 완료되면 처리하도록 하는 함수. 작업자 스레드에서 실행됨.
- _iocpHandle : CP의 핸들
- IocpObject : IOCP 패킷 또는 이벤트를 발생시키고 처리하는 주체(소켓과 그 기능, 정보들)를 의미한다. 이 클래스를 상속받는 자식 클래스의 예는 Session, Listener 클래스가 있다.
- GetHandle() abstract: 핸들(예를 들면 소켓)을 반환함.
- Dispatch() abstract : 발생된 IOCP이벤트를 처리하는 가상 함수.
- Listener : 클라이언트의 연결 요청을 받아들이고 적절히 등록하는 클래스. 즉 Listener 소켓과 그 기능과 부가정보를 래핑한 클래스. IocpObject 클래스의 자식 클래스.
- StartAccept() : 소켓 만들기, 소켓을 CP와 연결하기, 각종 소켓 설정하기, listen, accept 호출 등 accept 시작 및 준비 작업.
- CloseSocket() : 소켓 닫기.
- GetHandle() : 소켓 반환.
- Dispatch() : AcceptEx가 성공하고 IOCP에 의해 호출되어 이벤트를 처리하는 함수.
- RegisterAccept() : AcceptEx를 호출하고 Session을 만들어 내용을 채우고 acceptEvent에 Session을 설정하는 함수. AcceptEx 실패 시 재귀호출됨.
- ProcessAccept() : 실제로 acceptEvent발생 시 연결 작업을 처리하는 함수. 처리 완료 시 다시 RegisterAccept를 호출한다.
- _socket : 리스너 소켓.
- _acceptEvents : 발생한 acceptEvent 들을 저장하는 벡터.
- Session : 클라이언트의 연결을 의미하는 클래스. 클라이언트의 주소, 연결 상태 등의 정보를 가지고 이를 관리한다. IocpObject 클래스의 자식 클래스.
- SetNetAddress() : 연결된 세션의 주소를 설정하는 함수.
- GetAddress() : 연결된 세션의 주소를 반환하는 함수.
- GetSocket() : 연결된 세션의 소켓을 반환하는 함수.
- GetHandle() : 연결된 세션의 핸들(소켓)을 반환하는 함수.
- Dispatch() : 세션에 의해 발생한 IOCP 이벤트를 처리하는 함수.
- IocpEvent : OVERLAPPED 구조체(이벤트 핸들)를 상속받는 클래스. 비동기 함수 호출 시 LPWSAOVERLAPPED 구조체 형 매개변수로 넘겨준다.
- GetType() : 이벤트의 타입을 반환한다.
- ConnectEvent : IocpEvent 클래스의 자식 클래스. 클라이언트의 연결요청이 왔을 때 발생하는 이벤트.
- AcceptEvent : IocpEvent클래스의 자식 클래스. 클라이언트의 연결요청을 받아들였을 때 발생하는 이벤트. Session클래스를 멤버 변수로 가지고 있으며 SetSession()과 GetSession() 함수를 가지고 있다.
- RecvEvent : IocpEvent클래스의 자식 클래스. 클라이언트가 보낸 데이터를 받았을 때 발생하는 이벤트.
- SendEvent : IocpEvent클래스의 자식 클래스. 클라이언트에게 데이터를 보냈을 때 발생하는 이벤트.
- SocketUtils : 소켓의 연결, 바인드, accept 등 여러 작업들을 wrapping 하여 편의성을 더해주는 클래스.
- ConnectEx : WSAIoctl() 함수를 사용해 wsaconnectex 함수를 연결한 함수 포인터.
- DisconnectEx : WSAIoctl() 함수를 사용해 wsadisconnectex 함수를 연결한 함수 포인터.
- AcceptEx : WSAIoctl() 함수를 사용해 wsaacceptex 함수를 연결한 함수 포인터.
- BindWindowsFunction() : WSAIoctl() 함수를 사용하는 함수.
- CreateSocket() : 소켓 생성 함수.
- Bind() : 소켓을 주소와 바인딩하는 함수.
- BindAnyAddress() : 소켓을 INADDR_ANY 주소와 바인딩하는 함수.
- Listen() : listen() 호출.
- 그 외 각종 소켓 옵션 설정 함수.
- NetAddredss : IP주소 및 포트 를 의미하는 클래스. SOCKADDR_IN형 멤버 변수를 가지고 이를 다루고 있다.
- Service : 외부에서 ServerCore 을 사용할 때 필요한 기능들을 묶어 정리한 클래스. 이 클래스를 상속하여 다양한 기능들을 추가한 클래스를 만들어 제공할 수 있다.
- Start() abstract : 서비스의 시작을 의미하는 가상함수.
- CanStart() : 서비스를 시작할 수 있는지 여부를 반환하는 함수.
- CloseService() : 서비스를 끝내는 함수.
- CreateSession() : Session을 새로 생성하고 iocpCore에 등록하는 함수.
- ReleaseSession() : session을 제거하는 함수.
- Getters() & Setters() : 멤버 변수들을 Get, Set하는 함수.
- _type : 서비스의 타입.
- _netAddress : 주소.
- _iocpCore : iocpCore를 의미.
- _sessions : session의 묶음.
- _sessionCount : session 갯수.
- _maxSessionCount : 최대 session 갯수.
- _sessionFactory : session을 생성하는 함수 포인터.
- ClientService :클라이언트 프로그램에서 사용할 서비스 클래스. Service 를 상속받는 클래스. 클라이언트 프로그램에서 Service의 각종 오버라이드용 함수를 재정의해서 원하는 동작을 수행시킬 수 있다.
- ServerService: 서버 프로그램에서 사용할 서비스 클래스. Service 를 상속받는 클래스. 서버 프로그램에서 Service의 각종 오버라이드용 함수를 재정의해서 원하는 동작을 수행시킬 수 있다.
클래스 다이어그램
개략적인 흐름도
- IocpCore 객체가 CP를 생성함.
- Listener 객체의 listener 소켓을 CP에 등록함.
- SocketUtils를 이용해 소켓의 각종 초기화, AcceptEx 호출.
- CP로부터 IOCP 이벤트를 기다리는 Worker Thread 생성.
- 클라이언트의 접속 요청(AcceptEvent) 발생.
- CP가 IOCP 이벤트(Accept Event) 가 발생했음을 통지함. 그에 따라 대기중이던 Worker Thread가 깨어남.
- 깨어난 Worker Thread는 Listener::Dispatch()를 실행해서 AcceptEvent를 처리함.
- AcceptEvent 처리 과정에서 Session 객체가 생성됨.
- 다시 AcceptEx 호출.
참고 자료
https://gmlwjd9405.github.io/2018/07/04/class-diagram.html
인프런 강의
https://www.inflearn.com/course/%EC%96%B8%EB%A6%AC%EC%96%BC-3d-mmorpg-4/lecture/79696?tab=community&volume=0.85&speed=1.5
'프로젝트 > GameServerCore' 카테고리의 다른 글
메모리 관리 (0) | 2023.03.08 |
---|---|
ServerCore (0) | 2022.10.05 |
STL Allocator (0) | 2022.04.04 |
Stomp Allocator (0) | 2022.04.02 |
DeadLockProfiler (0) | 2022.02.18 |