資源簡介
一個c++使用protobuf作為消息協議的一個小demo,從這個demo里你可以很好地理解進行socket編程中的數據包的設計以及數據的打包和解包。
代碼片段和文件信息
//
//??main.cpp
//??ProtoBuf
//
//??Created?by?yangdamin?on?3/25/15.
//??Copyright?(c)?2015?yangdamin.?All?rights?reserved.
//
#include?
#include?
#include?
#include?
#include?“person.pb.h“
#include?“test.pb.h“
using?namespace?std;
class?ProtoMsgHandle
{
????public:
????/*??注冊消息處理函數?*/
????void????initHandles()
????{
????????registerHandle(&ProtoMsgHandle::handleProtoPerson);
????????registerHandle(&ProtoMsgHandle::handleProtoTest);
????}
????
????/*??處理網絡消息
?????*??data?為一個完整的數據包
?????*/
????void????handle(const?char*?data)
????{
????????bool?ret?=?false;
????????
????????const?char?*?current=data;
????????
????????//在網絡上傳輸的一個數據包總長度
????????int?packetLength=0;
????????
????????//從第一個位置上獲取到數據包總長度
????????memcpy(&packetLength?data?sizeof(int32_t));
????????
????????//指針后移
????????current+=sizeof(int32_t);
????????
????????//Message名字的長度
????????int?protoNameLength=0;
????????
????????//從第二個位置上獲取Message的名字的長度
????????memcpy(&protoNameLength?current?sizeof(int32_t));
????????
????????//指針后移
????????current+=sizeof(int32_t);
????????
????????//從第三個位置上獲取Message的名字
????????string?name(currentprotoNameLength);
????????
????????//指針后移
????????current+=protoNameLength;
????????
????????//取得Message的字節數
????????int?messageSize=packetLength-(sizeof(int32_t)+sizeof(int32_t)+protoNameLength);
????????
????????do{
????????????
????????????msg_handle?callback?=?m_callbacks[name];
????????????
????????????assert(callback?!=?NULL);
????????????
????????????if(callback?==?NULL)
????????????{
????????????????std::cout<<“proto?“< ????????????????break;
????????????}
????????????const?::google::protobuf::Descriptor*?descriptor?=?m_descriptors[name];
????????????assert(descriptor?!=?NULL);
????????????if(descriptor?==?NULL)
????????????{
????????????????std::cout<<“proto?“<riptor“< ????????????????break;
????????????}
????????????const?google::protobuf::Message*?prototype?=?google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);
????????????assert(prototype?!=?NULL);
????????????if(prototype?==?NULL)
????????????{
????????????????std::cout<<“proto?“< ????????????????break;
????????????}
????????????google::protobuf::Message*?msg?=?prototype->New();
????????????ret?=?msg->ParseFromArray(currentmessageSize);
????????????if(ret)
????????????{
????????????????(this->*callback)(msg);
????????????}
????????????else
????????????{
????????????????std::cout<<“proto?“< ????????????}
?????????
????????}while(0);
????}
private:
????void?handleProtoTest(test*?test)
????{
????????cout?<<“test->price()=“<price()?<????????cout?<“test->userid()=“<userid()?<????????cout?<“test->time()=“<time()?<????}
????void?handleProtoPerson(person*?person)
????{
????????cout?<“person->age()=“<age()?<????????cout?<“
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2015-03-25?18:27??ProtoBuf\
?????文件????????6148??2015-03-25?18:28??ProtoBuf\.DS_Store
?????目錄???????????0??2015-03-25?18:32??__MACOSX\
?????目錄???????????0??2015-03-25?18:32??__MACOSX\ProtoBuf\
?????文件?????????120??2015-03-25?18:28??__MACOSX\ProtoBuf\._.DS_Store
?????目錄???????????0??2015-03-25?18:29??ProtoBuf\.git\
?????目錄???????????0??2015-03-25?14:32??ProtoBuf\.git\branches\
?????文件??????????15??2015-03-25?14:32??ProtoBuf\.git\COMMIT_EDITMSG
?????文件?????????137??2015-03-25?14:32??ProtoBuf\.git\config
?????文件??????????73??2015-03-25?14:32??ProtoBuf\.git\desc
?????文件??????????23??2015-03-25?14:32??ProtoBuf\.git\HEAD
?????目錄???????????0??2015-03-25?14:32??ProtoBuf\.git\hooks\
?????文件?????????452??2015-03-25?14:32??ProtoBuf\.git\hooks\applypatch-msg.sample
?????文件?????????896??2015-03-25?14:32??ProtoBuf\.git\hooks\commit-msg.sample
?????文件?????????189??2015-03-25?14:32??ProtoBuf\.git\hooks\post-update.sample
?????文件?????????398??2015-03-25?14:32??ProtoBuf\.git\hooks\pre-applypatch.sample
?????文件????????1642??2015-03-25?14:32??ProtoBuf\.git\hooks\pre-commit.sample
?????文件????????1352??2015-03-25?14:32??ProtoBuf\.git\hooks\pre-push.sample
?????文件????????4951??2015-03-25?14:32??ProtoBuf\.git\hooks\pre-reba
?????文件????????1239??2015-03-25?14:32??ProtoBuf\.git\hooks\prepare-commit-msg.sample
?????文件????????3611??2015-03-25?14:32??ProtoBuf\.git\hooks\update.sample
?????文件????????1112??2015-03-25?18:27??ProtoBuf\.git\index
?????目錄???????????0??2015-03-25?14:32??ProtoBuf\.git\info\
?????文件??????????40??2015-03-25?14:32??ProtoBuf\.git\info\exclude
?????目錄???????????0??2015-03-25?18:32??__MACOSX\ProtoBuf\.git\
?????目錄???????????0??2015-03-25?18:32??__MACOSX\ProtoBuf\.git\info\
?????文件?????????171??2015-03-25?14:32??__MACOSX\ProtoBuf\.git\info\._exclude
?????目錄???????????0??2015-03-25?14:32??ProtoBuf\.git\logs\
?????文件?????????183??2015-03-25?14:32??ProtoBuf\.git\logs\HEAD
?????目錄???????????0??2015-03-25?14:32??ProtoBuf\.git\logs\refs\
?????目錄???????????0??2015-03-25?14:32??ProtoBuf\.git\logs\refs\heads\
............此處省略70個文件信息
- 上一篇:基于遺傳算法的MFC矩形排樣UI
- 下一篇:C++ MFC 吹泡泡 源代碼
評論
共有 條評論