https://jungwoong.tistory.com/70?category=1114028

 

[protobuf] c++ 환경에 설치하기

protobuf란 google이 만든 언어와 플랫폼에 중립적(모두 사용가능하다는 뜻)이며 확장성 있는 구조화된 데이터를 직렬화하기 위한 방법입니다. (마치 XML과 비슷하지만 작고, 빠르고 간단합니다.) 사용자는 .proto..

jungwoong.tistory.com

이글은 protobuf가 설치되어 있다는 가정하에 go 컴파일러 설치 방법을 공유드립니다. 

만약에 protobuf가 설치 되어 있지 않다면 상단의 링크를 참고해서 protobuf를 먼저 설치 후에 진행하셔야 합니다. 

 

패키지 설치 

 protoc의 옵션을 보면 golang소스로 컴파일하는 --go_out 옵션이 존재하지 않습니다. 

 golang에서 protobuf를 사용하려면 아래의 패키지를 설치해야합니다. 

go get -d -u github.com/golang/protobuf/proto
go get -d -u github.com/golang/protobuf/protoc-gen-go
go install github.com/golang/protobuf/protoc-gen-go

 설치가 완료되면 protoc에 --go_out 옵션을 사용해서 .proto파일을 .go 파일로 생성할 수 있습니다. 

set CURRENT_PATH=%~dp0
echo %CURRENT_PATH%

protoc -I%CURRENT_PATH% --go_out=%CURRENT_PATH% %CURRENT_PATH%LogicPacket.proto

 .proto 파일이 있는 위치에서 위의 배치를 실행하면 LogicPacket.pb.go이 생성되는 것을 확인 할 수 있습니다.

 생성된 파일을 프로젝트에 추가한 후 사용하면 됩니다. 

간단한 사용 방법 

syntax = "proto3";
package examchatserverPacket;
option go_package = ".;examchatserverPacket";

message C2SPCLoginUserReq {
  string UserID = 1;
}

message S2CPCLoginUserRes {
  uint32  Result = 1;
  uint32  UserSn = 2;
  string  UserID = 3;
}

 위의 형태의 .proto 파일을 protoc로 컴파일 해서 go형식의 소스코드를 생성합니다. 

// C2SPCLoginUserReq 구조체를 생성합니다.
req := examchatserverPacket.C2SPCLoginUserReq{}
// userid 셋팅합니다. 
req.UserID = userid
// proto.Marshal을 통해서 C2SPCLoginUserReq를 []byte로 serialize합니다.
// 실패하면 err에 에러값이 발생하빈다.
b, err := proto.Marshal(&req)
if err != {
	// 에러 출력 
}

 위의 예제는 C2SPCLoginUserReq 구조체를 직렬화하는 예제를 보여줍니다. 

req := examchatserverPacket.C2SPCLoginUserReq{}
// Packet 버퍼에서 C2SPCLoginUserReq 구조체를 Deserialization합니다. 
err := proto.Unmarshal(p.PacketBuffer(), &req)
if err != nil {
	Logger().Println(err)
}

 위의 예제는 패킷버퍼의 데이터를 C2SPCLoginUserReq 구조체로 역직렬화하는 예제를 보여줍니다. 

'protobuf' 카테고리의 다른 글

[protobuf] c++ 환경에 설치하기  (0) 2020.05.03

+ Recent posts