목록Game Dev/Game Server (78)
KoreanFoodie's Study
[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)에 특정 소켓을 넣어 '관찰' 할 수 있게 만듦으로써 우리가 원하는 특정 동작을 특정 소켓이 수행하도..
[C++ 게임 서버] 3-8. Select 모델 핵심 : 1. Select 모델을 사용하면 소켓의 유효성을 데이터를 주고 받기 전에 미리 체크할 수 있다. 2. 관찰하고자 하는 소켓을 fd_set 에 넣고, select 하면 관찰이 시작되며, 적어도 하나의 소켓이 준비되면 리턴된다(낙오자는 알아서 제거됨) 3. 세션을 이용해서 소켓을 관리할 수 있다. 세션은 두 기기간의 통신이 연결되었을 때 구축되고, 끊겼을 때 파괴되는 양방향 링크라고 생각하면 된다. 이번 시간에는 select 함수가 핵심이 되는 Selet 모델에 대해 알아보자. Select 모델을 사용하면 소켓 함수 호출이 성공할 시점을 미리 알 수 있다. 이것은 아래와 같은 상황에서 큰 이점으로 작용한다 : 블로킹 소켓 : 조건이 만족되지 않아서 ..
[C++ 게임 서버] 3-7. 논블로킹 소켓 핵심 : 1. 논블로킹 소켓은, 블로킹 소켓과 다르게 연결 및 송수신이 일시적으로 불가능한 경우, SpinLock 처럼 while 문을 돌며 다시 시도를 한다. 2. 논블로킹 소켓을 만드는 것은 간단하다. ioctlsocket 을 사용하면 된다. 3. 논블로킹 소켓 사용시, WSAEWOULDBLOCK 에러가 나올 경우, 다시 시도한다. 이는 송수신 버퍼의 상태가 비어 있거나 가득 차 있어 송수신이 불가능한 임시적인 상태이기 때문이다. 우리가 이전 글에서 활용했던 것은 소켓은 블로킹 소켓이다. 따로 옵션을 설정한 것 같지는 않은데? 그럼에도 불구하고, 우리가 만든 소켓이 기본적으로 블로킹 소켓으로 잡힌 것인데.. 논블로킹 소켓을 이야기하기 전에 먼저 블로킹 소켓..
[C++ 게임 서버] 3-6. 소켓 옵션 핵심 : 1. 소켓에도 옵션을 설정하고, 설정값을 불러올 수 있다. ::getsockopt 와 ::setsockopt 가 그것이다. 2. 소켓 옵션의 설정 단계는 3 가지로, 소켓 코드(SOL_SOCKET), IPv4(IPPROTO_IP), TCP 프로토콜(IPROTO_TCP) 이다. 3. SO_KEEPALIVE, SO_LINGER, SD_SEND, SO_REUSEADDR 등 자주 쓰이는 옵션을 눈에 익히면 좋다! 우리는 지금까지 소켓을 만들어서 서버-클라이언트 통신을 진행했는데, 사실 핸드폰에도 여러 기종이 있고 다양한 커스터마이징이 가능하듯이, 소켓도 여러 옵션을 줄 수 있다. 이를 설정하는 함수는 ::setsockopt 인데, 인자를 보면... 로 되어 있다..
[C++ 게임 서버] 3-5. UDP 서버 실습 핵심 : 1. UDP 는 TCP 와 다르게, 패킷 간의 경계가 있고 속도가 빠르다. 다만 패킷의 순서가 보장되지 않으며, 데이터가 유실될 위험이 존재한다. 2. UDP 실습의 경우, TCP 실습 코드에서 ::connect 와 ::listen 만 없으면 로직은 거의 동일하다. 3. UDP 는 Connected UDP(일종의 즐겨찾기 기능)을 활용하면, sendto 대신 send 를, recvfrom 대신 recv 를 사용하여 API 를 더 간단하게 사용 가능하다. 저번에는 TCP 방식으로 데이터를 전송하는 실습을 했으니, 이번에는 UDP 방식으로 데이터를 전송해 보자. 사실 그리 다르지는 않다. 조금 간소화되었다고 하면 될까? 3-2 에 보면 기본적으로 소켓..
[C++ 게임 서버] 3-4. TCP vs UDP 핵심 : 1. TCP 와 UDP 는 네트워크 프로토콜 중, 트랜스포트 레이어에 해당하는 규칙이다. 2. TCP 는 안전하며(데이터 유실이 없음), 데이터의 순서가 보장된다. 하지만 각 패킷의 경계(Boundary)가 없어 데이터가 합쳐지거나 쪼개질 수 있으며, UDP 에 비해 상대적으로 느리다. 3. UDP 는 빠르며(일단 데이터를 보내고 봄), 패킷의 경계가 있어 데이터가 쪼개지거나 합쳐지지 않는다. 하지만 패킷 전송의 순서가 보장되지 않으며, 데이터가 유실될 위험성이 있다. 이번 글에서는 간단히 TCP 와 UDP 의 차이에 대해 알아보도록 하자. 네트워크 공부를 깊게 하지 않았어도, 오며가며 그 둘의 차이에 대해서는 알게 되는데, 이번 글에서는 그에 ..