지난번에 패킷헤더와 패킷세션을 만들어 클라와 서버가 통신할 때 어디서부터 어디까지가 1덩어리의 패킷인지 확인하고, recvBuffer에 더이상 처리할 수 있는 패킷이 없을 때까지 처리해주도록 만들어봤다.

 

이번에는 다양한 패킷을 쉽게 생성, 직렬화, 역직렬화 할 수 있고 사용하기도 편한 protobuf 라이브러리를 추가해 사용해보자.


주의

깔끔하게 초기화된 환경에서 진행한게 아니라서 환경에 따라 똑같이 했는데도 같은 동작이 발생하지 않을 수 있음.


protobuf 설치

 

Protocol Buffers

Protocol Buffers are language-neutral, platform-neutral extensible mechanisms for serializing structured data.

protobuf.dev

위 사이트에 가서 Download and install 이동,  src 클릭

 

src에 들어가서 문서를 보면 윈도우 환경은 vcpkg로 protobuf와 의존성을 다 받을 수 있다고 한다.

vcpkg install protobuf protobuf:x64-windows

파워쉘에서 위 명령어를 입력해 protobuf를 설치한다.

설치 완료

 

환경변수에 Path를 추가한다.

vcpkg로 설치한 protoc 실행파일의 디폴트 경로

C:\vcpkg\installed\x64-windows\tools\protobuf

 

 

설치가 잘 됐는지 버전을 확인해보자.

 protoc --version

 

정상적으로 설치됐으니 간단한 test.proto 파일을 하나 만들어 cpp 파일로 변환시켜보자.

프로젝트폴더/Protobuf/test.proto

syntax = "proto3";

package test;

message Person {
  string name = 1;
  int32 age = 2;
}

 

쉘에서 해당 위치로 이동하고, 아래 명령어를 입력해 protobuf 코드를 생성한다.

protoc --cpp_out=. ./test.proto

test.pb.cc와 test.pb.h 파일이 생성됐다.

 

그리고 아래 명령어를 입력하자.

vcpkg integrate install

 Visual Studio 글로벌 설정파일에 vcpkg 경로를 등록하는 것이고, vcpkg를 설치한 다음 한번만 하면 된다고 한다. (라이브러리 설치할때마다 할 필요 없음)

 

더미클라와 게임서버 프로젝트에 Protocol 필터를 하나 만들어서 기존항목 추가로 아까 추가한 파일들을 프로젝트에 포함시켜주자.

그리고 pch 어쩌구 하니까 cc파일 설정에서 미리 컴파일된 헤더 사용안함으로 바꿔주자.


테스트

#include "pch.h"
#include "../Protobuf/test.pb.h"

int main()
{
	test::Person person;
	person.set_name("John Doe");
	person.set_age(30);
	cout << "Name: " << person.name() << ", Age: " << person.age() << endl;
}

 

지금은 include path 쓰는게 불편하니까 프로젝트 속성에서 Protobuf 폴더도 추가해주자.

#include "pch.h"
#include "test.pb.h"

int main()
{
	test::Person person;
	person.set_name("John Doe");
	person.set_age(30);
	cout << "Name: " << person.name() << ", Age: " << person.age() << endl;
}

이제 편안하게 추가할 수 있다.


GitHub 문제 해결

이렇게 하고나서 Git commit을 하려고 보니 정작 프로젝트 래포지토리에는 Protobuf include 파일도 없고 라이브러리파일도 없다. 가장 먼저 떠오른 해결법은 그냥 vcpkg에 설치된 있는 Protobuf Include 폴더와 라이브러리를 그대로 가져다가 프로젝트에 포함시키는 것이었는데, 이건 환경에따라서 아예 작동을 안할 수도 있으니 그냥 래포지토리에 README.md 파일과 vcpkg.json 파일을 추가해 알려주는게 낫겠다 싶어서 그렇게 했다.

 

README가 추가됐다!

 

현재까지의 Git 버전

 

GitHub - Dodontak/Project_Island_GameServer at d34a70fedf24c7276cbcebdf8b9ea4ab72f4641a

Contribute to Dodontak/Project_Island_GameServer development by creating an account on GitHub.

github.com


삽질 기록

처음엔 게임서버 강의에서 봤던 것 처럼 cmake를 사용해서 빌드하려했다.

protobuf 깃허브에서 34.x 버전(34.1)의 protoc.exe 파일과 소스코드를 받았다.

protoc는 잘 작동하는데 소스코드로 cmake를 하는데 옵션이 너무 많고 강의 내용 버전과 지금 버전이 너무 차이가 많이나서 그런지 강의내용은 별로 도움이 안됐다.

게다가 뭔놈의 체크리스트는 이렇게 많은지 이중에서 나한테 필요한게 도대체 뭔지도 잘 모르겠다. 애초에 cmake를 쓰는 방법도 제대로 모르고. (대충 makefile을 만들어주는 도구로만 알고있음)

 

그래서 AI에게 물어보면서 진행했는데, 무슨 abseil 라이브러리도 전부 프로젝트에 포함시켜야 하는 상황이 생겨서 이건 좀 아닌 것 같아서 다른방법을 찾다가 protobuf 문서에 vcpkg로 의존파일도 다 받을수있다길래 사용해봤는데 생각보다 너무 쉽게 해결됐다.

 

다만 앞서 말한것처럼 프로젝트 래포지토리에 protobuf가 포함되지 않는다는게 상당히 걸리지만, 생각해보면 docker로 작업할 때도 모든 라이브러리를 래포지토리에 포함시키진 않지 않던가? 그냥 Dockerfile에

RUN apt install -y  protobuf-compiler libprotobuf-dev

도커에서는 이렇게 라이브러리를 온라인으로 설치하고 말았던걸 생각해보면 굳이 모든 라이브러리를 래포지토리에 넣을 필요는 없을 것 같아서 일단은 그냥 README에 써놓는걸로 해결됐다 쳤다.

 

근데 언젠가 CMake 쓰는법을 제대로 배워두긴 해야할 것 같다.

+ Recent posts