목록Categories (1104)
KoreanFoodie's Study

[C++ 게임 서버] 4-4. Session #1 핵심 : 1. 게임 세션에 대한 기본 동작과 구현을 숙지하자. 제일 중요한 것은, 흐름이다. 2. 세션에 대한 Reference Count 는 상황에 맞게 잘 처리해 주어야, IocpObject 나 Session 에서 Memory Leak 이 발생하지 않는다. 이번 글에서는, Session 클래스를 만들고 기본적인 Accept 동작을 할 수 있도록 구현을 진행해 보겠다. 먼저 Session 클래스의 구현을 한 번 보자. Session.h #pragma once #include "IocpCore.h" #include "IocpEvent.h" #include "NetAddress.h" class Service; /*-------------- Session -..

[C++ 게임 서버] 4-3. Server Service 핵심 : 1. IocpObject 는 안전성을 위해 shared_ptr 를 차용하는 것이 좋다. 2. 서버는 클라이언트와만 통신하지 않고, 다른 서버나 DB 서버와도 통신할 수 있다. 따라서 용도에 따라 세션의 생성 및 관리를 할 수 있도록, 서비스를 만들어 주면 편리하다. 우리는 이전에 IOCP Core 클래스를 만들어 핸들, 세션, 소켓과 관련한 기능들을 간단히 다룰 수 있도록 만들었다. 그런데 이전에 우리가 만든 IOCP 클래스는 리스너에서 Accept 를 받으면 세션을 임의로 생성하는 식으로 구현이 되어 있다. 그런데 사실 세션은 특정 서버에 종속되면 자유도가 떨어지게 된다. 우리는 일반적으로 게임 서버라고 하면 '클라이언트 서버' 사이의 ..

코딩 테스트를 대비하여, 알아야 할 알고리즘 목록을 정리하며 읽어보면 좋을 블로그 링크들을 연결해 보았다(제가 작성한 것은 아님). 읽어봄직한 글들에 링크를 달은 것이니, 코테로 손을 예열하기 전에 두뇌를 예열하는데 사용하면 좋겠다! 🤣 기본 정렬 - 퀵소트 - 힙소트 - 머지소트 우선순위큐(힙) 이분탐색 DFS(깊이 우선 탐색) BFS(너비 우선 탐색) 백트래킹 그리디(탐욕법) 누적합 투포인터(두 포인터) 위상정렬 DP 심화 연결 성분 (Connected Component) 다익스트라 플로이드 와샬 벨만 포드 유니온-파인드 (Disjoint set) MST(최소 스패닝 트리) 프림 크루스칼 세그먼트 트리 트라이 이분 그래프(Bipartite Graph). KMP CS CS 기초 지식

[언리얼] 다음 틱에 특정 동작 수행시키기핵심 :1. SetTimerForNextTick 을 사용한다때로는 영 좋지 못한 이유로, 특정 동작을 다음 틱에 실행시켜야 하는 상황이 존재한다.AActor* actor = GetActor();// 타이머는 클리어 처리하고 다음 틱에 디스폰 액터를 호출ClearTimerEvent();GetWorld()->GetTimerManager().SetTimerForNextTick([actor]() { actor->Destroy(); }); 그럴때는, 위 함수를 사용하면 된다. 언리얼 글 중 제일 짧은 글인 듯 하다. 😅

[C++ 게임 서버] 4-2. IocpCore 핵심 : 1. IOCP 모델의 큰 그림을 이해하는 것이 중요하다. Completion Port, Socket, Session 등의 개념을 잘 알아두자. 2. 앞으로는 IocpCore 를 활용하여 API 를 캡슐화한 API 를 사용할 것이다. IocpCore 는 IocpObject 를 간접적으로 활용한다. 3. OVERLAPPED 를 상속받은 IocpEvent 와, HANDLE 을 편리하게 사용할 수 있는 IocpObject 를 상속받아 세부 사항을 구현할 것이다. 이제 IOCP 모델을 구현함에 있어 줄곧 사용할 IOCP 관련 객체들을 만들어보자. 사실 IocpCore 라고 거창하게 이름을 지었지만, 실상 기존에 사용하던 HANDLE, Socket, Sessi..

[C++ 게임 서버] 4-1. Socket Utils 핵심 : 1. IOCP 서버 구축을 위해, ::InetNtopW, ::setsockopt 함수 등을 활용하여 필요한 네트워크 함수들을 Wrapping 한 헬퍼 함수들을 만들어 보자. 2. 소켓을 사용할 때, Connect/Disconnect/Accept 에 해당하는 함수 포인터를 만들고, 소켓과 바인딩하여 해당 주소를 얻어 와 간편하게 사용할 수 있다. ::WSAIoctl 함수를 참고하자. 이번 4 챕터는, 네트워크 라이브러리를 제작하는 부분이다. 사실 이번 챕터는 조금 생소해 보이는 API 들을 사용하면서, 앞으로 구축할 IOCP 서버를 위한 밑작업을 하는 부분이다. 그러니 낯설어 보이는 녀석들이 많이 보이더라도 '그려려니...' 하면서, 문서를 보..

[C++ 게임 서버] 3-12. Completion Port 모델 핵심 : 1. IOCP 모델은 스레드마다 갖고 있는 APC 대신, Completion Port 를 중앙에서 하나 관리한다. 2. 스레드는 Alertable Wait 상태로 돌입하는 것 대신, 서버는 결과를 처리할 수 있을 때 GetQueuedCompletionStatus 를 호출하여 정보를 조회해 알맞은 동작을 수행한다. 3. 만약 특정 쓰레드가 특정 이벤트를 한 번 더 받길 원한다면, iocpHandle 과 바인딩한 함수 내부에서 WSARecv 등을 호출해 이벤트를 더 받을 수 있도록 설정해 주어야 한다. 드디어... 세번째 챕터의 마지막이자 제일 중요한, IOCP 모델에 대해서 알아보자. 먼저, 바로 전에 알아보았던 Overlapped..

[C++ 게임 서버] 3-11. Overlapped 모델 (콜백 기반) 핵심 : 1. 콜백을 활용하여 Overlapped 모델을 만들면, 이벤트의 갯수 제한 없이(64개) 스레드가 특정 네트워크 이벤트를 받았을 때 원하는 함수를 호출하게 만들 수 있다. 2. 비동기 입출력을 시작하고 나서 스레드는 Alertable Wait 상태로 들어가게 되고, OS 에서 비동기 입출력이 완료된 후, APC 큐를 비워주며(한꺼번에 비워준다) 콜백 함수를 호출하게 되면, 스레드는 Alertable Wait 상태를 빠져나간다. 3. 콜백 기반은 이벤트에 대한 갯수 제한(64개)가 없으나, 모든 비동기 소켓 함수에서 사용 가능하지는 않으며(accept), Alertable Wait 상태로 빈번하게 전환되어 성능이 저하될 수 ..

[C++ 게임 서버] 3-10. Overlapped 모델 (이벤트 기반) 핵심 : 1. 블로킹 방식을 사용하면 함수 호출 후, 작업 완료시까지 대기를 하며 논블로킹 방식을 사용하면 다른 작업을 한다. 2. 논블로킹/비동기 방식의 모델이 AIO(Overlapped IO) 모델로, 운영체제는 이벤트 객체를 Signaled 상태로 만들어 완료 상태를 알려준다. 3. WSAWaitForMultipleEvents 함수를 호출해서 이벤트 객체의 Signal 을 판별 후, WSAGetOverlappedResult 를 호출해 비동기 입출력 결과를 확인한다. 이전 글에서 정리했던 Select 모델 말고, 실제로 사용할 IOCP 모델을 위한 기초 작업을 해 보자. 이번 글에서는 Overlapped 모델에 대해 다룰 것인데..

[C++ 게임 서버] 3-9. WSAEventSelect 모델 핵심 : 1. WSAEventSelect 모델을 사용하면, 특정 소켓과 특정 네트워크 이벤트를 연결해, 실제 이벤트가 발동했을 때 바인딩된 소켓으로부터 원하는 정보를 얻을 수 있다. 2. Select 모델과 달리, 매번 Set 을 만들지 않고 사용한 소켓에 해당한 이벤트만 Reset 해 주면 된다. 3. 이벤트 발동 시, 적절한 함수를 호출해 주어야 해당 이벤트를 다시 사용할 수 있다. 우리는 이전 글에서 Select 모델에 대해 배웠다. 간단히 얘기해서, Select 모델을 활용하면 특정 역할을 하는 SET(READ_SET/WRITE_SET)에 특정 소켓을 넣어 '관찰' 할 수 있게 만듦으로써 우리가 원하는 특정 동작을 특정 소켓이 수행하도..