1. Packet Generator

이 번 챕터에는 Packet Generator와 Performance Monitor라는 두 섹션을 살펴 볼 수 있었다. 여기서 성능 모니터의 경우에는 그라파나(Grafana) 같은 웹을 기반으로 한 솔루션이 유행 중이라 현업에 활용하기는 어려울 것으로 보인다.

그래서, 나는 Packet Generator만 조금 살펴 보았는데, 이 것 역시 요새 유행하는 프로토콜 버퍼(protobuf)나 플랫 버퍼(flatbuf) 같이 IDL(Interface Description Language)을 작성하고, 자동으로 build/extract 기능을 타겟 언어 코드로 만들어 주는 기능에 대한 내용이었다.

본 챕터의 코드는 C++로 생성하는 기능만 있으나, 아직 매시브한 게임서버는 C++로 대부분 이루어지기 때문에 내재화된 솔루션을 갖추기 위해 참고할만 하겠다.

책의 예제 IDL을 한번 살펴 보겠다.

typedef enum TCP_PROTOCOL
{
    PT_VERSION=0x1000000,
  
    PT_CHANNEL_NICKNAME,
    /*
    WCHAR		: 	USER_ID[32]
    WCHAR		:	NICK_NAME[32]
    */
    PT_CHANNEL_NICKNAME_SUCC_U,
    /*
    WCHAR		:	USER_ID[32]
    WCHAR		:	NICK_NAME[32]
    */
    PT_CHANNEL_NICKNAME_FAIL_U,
    /*
    DWORD		:	ERROR_CODE
    */
    
    PT_END
};

IDL의 형태는 대략 이렇다. 사실은 실제 C++ 헤더 파일인데, 이렇게 하는 이유는 메시지의 ID를 위 enum 값을 그대로 이용하기 위해서이다. 저자의 걸출함이 보이는 부분은 PT_VERSION인데, enum 위에 저걸 달아줌으로 해서, PT_VERSION을 기준으로 message ID가 결정되는 것이다. PT_VERSION에 다른 값이 들어가면 ID가 자동으로 변경되므로, 버전 관리가 용이하게 된다.

enum 값 아래에는 /* */으로 된 meta programming 적인 내용이 보인다. 저자께서 제작한 Packet Generator는 바로 저 부분을 parsing하여 builder/extractor를 생성한다. 코드를 간략히 살펴 보았을 때는, 렉서(lexer) 수준의 파싱은 아니지만, 규칙만 잘 맞추면 무리 없이 진행이 될 것으로 보인다.

위 IDL을 통해 생성된 메시지 규약은 대략 아래와 같을 것이다.

4바이트 32바이트 32바이트

(요청)

PT_CHANNEL_NICKNAME

(0x1000001)

USER_ID NICK_NAME

(성공 응답)

PT_CHANNEL_NICKNAME_SUCC_U

(0x1000002)

USER_ID NICK_NAME

(에러 응답)

PT_CHANNEL_NICKNAME_FAIL_U

(0x1000003)

(스페셜) 4바이트 : ERROR_CODE 없음

 

PS : FlatBuffers

공부 삼아, 위 내용을 게임 쪽에서 많이 쓰는 FlatBuffers에 맞춘 IDL을 작성해 보는 것으로 챕터 리뷰를 마칠까 한다.

namespace PT_VERSION_1000000;

union MESSAGE_ID
{
	PT_CHANNEL_NICKNAME,
	PT_CHANNEL_NICKNAME_SUCC_U,
	PT_CHANNEL_NICKNAME_FAIL_U,
}

table Message
{
	Packet: MESSAGE_ID;
}

root_type Message;


table PT_CHANNEL_NICKNAME
{
	USER_ID: string;
	NICK_NAME: string;	
}


table PT_CHANNEL_NICKNAME_SUCC_U
{
	USER_ID: string;
	NICK_NAME: string;	
}

table PT_CHANNEL_NICKNAME_FAIL_U
{
	ERROR_CODE : uint32;
}

 

FlatBuffers compiler로 빌드한 결과 파일 내용은 아래에 접어 두었다.

 

Posted by JMAN