프로젝트/GameServerCore

네트워크 라이브러리

춤추는수달 2022. 5. 30. 05:24

파일 목록

  • 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의 각종 오버라이드용 함수를 재정의해서 원하는 동작을 수행시킬 수 있다. 

 


클래스 다이어그램


개략적인 흐름도

  1. IocpCore 객체가 CP를 생성함.
  2. Listener 객체의 listener 소켓을 CP에 등록함.
  3. SocketUtils를 이용해 소켓의 각종 초기화, AcceptEx 호출.
  4. CP로부터 IOCP 이벤트를 기다리는 Worker Thread 생성. 
  5. 클라이언트의 접속 요청(AcceptEvent) 발생.
  6. CP가 IOCP 이벤트(Accept Event) 가 발생했음을 통지함. 그에 따라 대기중이던 Worker Thread가 깨어남.
  7. 깨어난 Worker Thread는 Listener::Dispatch()를 실행해서 AcceptEvent를 처리함. 
  8. AcceptEvent 처리 과정에서 Session 객체가 생성됨.
  9. 다시 AcceptEx 호출.

참고 자료

클래스 다이어그램 작성법

https://gmlwjd9405.github.io/2018/07/04/class-diagram.html

 

[UML] 클래스 다이어그램 작성법 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

인프런 강의

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