목록Categories (1104)
KoreanFoodie's Study

[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 의 차이에 대해 알아보도록 하자. 네트워크 공부를 깊게 하지 않았어도, 오며가며 그 둘의 차이에 대해서는 알게 되는데, 이번 글에서는 그에 ..

[C++ 게임 서버] 3-3. TCP 서버 실습 핵심 : 1. TCP 에서는 송수신 버퍼가 존재하며, 통신을 할 때 버퍼에 데이터를 담고 꺼내는 방식으로 통신이 이루어진다. 2. 클라에서 송신을 하려고 하는데 송신 버퍼가 가득 차 있거나, 서버에서 수신을 하려고 하는데 수신 버퍼가 비어 있으면 Blocking 상태에 돌입한다. 3. 신기하게도, 버퍼 내 각 데이터 별로는 명확한 경계가 없어 데이터는 합쳐지거나 쪼개져서 인식될 수 있다. 저번에 소켓 프로그래밍 기초를 다루면서, 소켓을 만들고, 주소를 할당하고, 소켓과 주소를 할당한 후, 실제로 통신을 해보는 실습을 진행했다. 이번 시간에는 TCP 실습을 해 볼 예정이다. 코드와 PPT 를 보면서, 실습을 진행해 보자. 일단 저번 시간에 소켓 바인딩 작업 ..

[C++ 게임 서버] 3-2. 소켓 프로그래밍 기초 #2 핵심 : 1. 소켓 프로그래밍 셋업에는 여러 API 들을 통한 세팅이 필요하다. 하지만 너무 겁먹지 말고, 흐름만 이해하자. 2. 클라이언트 쪽에서는 핸드폰 구입(client소켓 세팅)과 가게의 위치와 번호(서버 IP 주소와 포트)를 알아낸 후, 연결(::connect)을 시도하기만 하면 된다. 3. 서버 쪽에서는 핸드폰 구입(listen 소켓 세팅) 후, 가게의 위치와 번호(서버 IP 주소와 포트)를 설정한 후, 안내원의 폰을 개통(소켓과 서버 주소 ::bind)하고 영업을 시작(::listen)하면 된다. 이제 저번에 이야기했던 개념을 바탕으로, 실제 코드를 보자. 아마 익숙치 않은 코드가 잔뜩 등장을 하게 될 텐데, 하나하나 전부 알아야 한다..

[C++ 게임 서버] 3-1. 소켓 프로그래밍 기초 #1 핵심 : 1. 소켓 프로그래밍을 고객(클라이언트)와 가게(서버) 관계에 비유하여 개념을 이해해 두자. 드디어 기나긴 Memory 관련 포스팅을 마치고, 이제 네트워크 프로그래밍으로 들어간다. 먼저 소켓 프로그래밍을 본격적으로 시작하기 전에, 간단한 개념을 짚고 넘어가 보자. 참고로, 이해에는 예시가 최고다. 먼저, 우리가 중국집에 전화를 한다고 해 보자. 그런데 이 중국집은 유명하고 큰 곳이라, 전화를 받는 안내 요원이 따로 존재한다. 우리는 중국집에 등록된 대표 전화로 전화를 걸고, 용건을 전달한다. 그러면 안내원은 용건에 맞는 작업자의 번호를 알려준다. 그럼 이제 다음부터는 대표 전화를 통해 중국집에 연락할 필요 없이, 테이블에 앉아 있는 작업..

[C++ 게임 서버] 2-10. TypeCast 핵심 : 1. 템플릿 메타 프로그래밍(TMP)로 TypeCast 를 구현해 보자. static_cast 를 이용해 dynamic_cast 의 효과를 낼 수 있다! 2. TMP 를 사용하면, 컴파일 타임에 타입과 관련된 값을 미리 알 수 있다. 3. TypeCast 가 가능한지 여부를 행렬에 저장하여 사용할 것이므로 속도가 매우 빠르며, shared_ptr 에도 사용할 수 있다! 제목은 TypeCast 지만, 오늘은... 즐거운 흑마법 시간이다! 흑마법... 아니, 템플릿 메타 프로그래밍(Template Meta Programming; 줄여서 TMP 라고 할 것)으로, 다양한 타입 간의 Casting 을 직접 만들어 볼 것이다. 왜.. 그런 것을 하냐고? 왜..
보호되어 있는 글입니다.

[C++ 게임 서버] 2-9. Object Pool 핵심 : 1. ObjectPool 을 사용하면, 각 타입별로 풀을 만들게 되어, 메모리 오염 이슈가 발생했을 때 문제의 원인을 파악하기가 쉬워진다. 2. 커스텀한 삭제자를 객체 메모리를 풀에 반납하는 형식을 넣은 MakeShared 를 활용하면, ObjectPool 을 사용하는 스마트 포인터를 쉽게 만들 수 있다. 3. Allocator 를 StompAllocator 로 쉽게 교체할 수 있도록 #define 문법을 사용하면, 테스트용으로 StompAllocator 를 쉽게 적용 가능하다. 우리는 이전까지 메모리 풀에 대해 알아보았는데, 메모리 풀은 메모리 크기에 따라 객체들이 알아서 풀을 같이 사용한다. 집단 생활이 으레 그렇듯, 기숙사 생활에서도 문제..

C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 생성자를 private 하게 만든다고? 스마트 포인터에 배우다 보면, make_shared 와 new 를 이용해 스마트 포인터를 만드는 방식에 대해 배우게 된다. 이때, 효율성을 위해 make_shared 를 new 보다 선호하라는 말을 듣게 되는데, 그 이유는 명확하다(힙 할당이 2번 대신 1번 이루어지며, 같은 메모리 조각에 놓이는 데다가, new 에서 예외가 발생했을 때의 메모리 누수도 막을 수 있으니까). 그런데... 그럼에도 불구하고 new 를 사용해야 하는 경우를 보면, 크게 2가지 이유가 나온다. 커스텀 삭제자를 사용하는 경우 생성자가 private 인 경우 100번 양보해서, 1번은 그렇다 쳐도, 2번은 직관적으로 와닿지가 ..