- 最近應為工作的需要,合作的部門提供了protobuf的接口,總結了一下使用的過程和方法如下:
- 下載protobuf-2.3.0:
- http://protobuf.googlecode.com/files/protobuf-2.3.0.zip
- 安裝:
- unzip protobuf-2.3.0.zip
- cd protobuf-2.3.0
- ./configure
- make
- make check
- make install
- 結果:
- Libraries have been installed in:
- /usr/local/lib
- Head files hava been installed in:
- /usr/local/include/google/
- protobuf/
- 開始寫.proto文件:
- BaseMessage.proto:
- message MessageBase
- {
- required int32 opcode = 1;
- // other: sendMgrId, sendId, recvMgrId, recvId, ...
- }
- message BaseMessage
- {
- required MessageBase msgbase = 1;
- }
- BaseMessage.proto是其它消息proto文件的基礎,以容器模塊的C2S_GetContainerInfo為例:
- ContainerMessage.proto:
- import "BaseMessage.proto";
- message C2SGetContainerInfoMsg
- {
- required MessageBase msgbase = 1;
- optional int32 containerType = 2;
- }
- .proto文件編寫規則:
- 1)所有消息都需要包含msgbase這項,並編號都為1,即:
- required MessageBase msgbase = 1;
- 2)除了msgbase這項寫成required外,其它所有項都寫成optional。
- 編譯 .proto 文件
- protoc -I=. --cpp_out=. BaseMessage.proto
- protoc -I=. --cpp_out=. ContainerMessage.proto
- 生成BaseMessage.pb.h、BaseMessage.pb.cc
- ContainerMessage.pb.h、ContainerMessage.pb.cc
- 將它們添加到工程文件中。
- 編寫C++代碼:
- 1)發送消息:
- C2SGetContainerInfoMsg msg;
- msg.mutable_msgbase()->set_opcode(C2S_GetContainerInfo);
- msg.set_containertype(1);
- std::string out = msg.SerializeAsString();
- send(sockfd, out.c_str(), out.size(), 0);
- 2)接收消息
- char buf[MAXBUF + 1];
- int len;
- bzero(buf, MAXBUF + 1);
- len = recv(new_fd, buf, MAXBUF, 0);
- if (len > 0)
- {
- printf("%d接收消息成功:'%s',共%d個字節的數據/n",
- new_fd, buf, len);
- BaseMessage baseMsg;
- std::string data = buf;
- baseMsg.ParseFromString(data);
- int opcode = baseMsg.mutable_msgbase()->opcode();
- printf("opcode=%d/n", opcode);
- switch (opcode)
- {
- case C2S_GetContainerInfo:
- {
- C2SGetContainerInfoMsg msg;
- msg.ParseFromString(data);
- printf("containerType=%d/n", msg.containertype());
- break;
- }
- default:
- {
- break;
- }
- }
- }
- else
- {
- if (len < 0)
- printf("消息接收失敗!錯誤代碼是%d,錯誤信息是'%s'/n",
- errno, strerror(errno));
- close(new_fd);
- return -1;
- }
- 編譯C++代碼:
- Need to link lib:
- protobuf
- pthread
- 參考:
- 1,http://www.360doc.com/content/10/0822/16/11586_47942017.shtml
- 2,http://code.google.com/p/protobuf/
原文地址:http://blog.csdn.net/ganghust/article/details/6115283
項目主頁:http://code.google.com/p/protobuf/
下載:http://code.google.com/p/protobuf/downloads/list protobuf-2.4.1.tar.gz
1、./configure(注:默認可能會安裝在/usr/local目錄下,可以加--prefix=/usr來指定安裝到/usr/lib下,可以免去路徑的設置,路徑設置見Linux命令pkg-config)
2、make
3、make check
4、make install(需要超級用戶root權限)