Google protobuf的安装及使用
最近应为工作的需要,合作的部门提供了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 --prefix=/usr/local/protobuf
make
make check
make install
开始写.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/