• 大小: 11.31MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-07-12
  • 语言: C/C++
  • 标签: protobuf  C++  

资源简介

一个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()=“<< test->price() << endl;
        cout << “test->userid()=“<userid() << endl;
        cout << “test->time()=“<time() << endl;
    }
    void handleProtoPerson(person* person)
    {
        cout << “person->age()=“<age() << endl;
        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\description
     文件          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-rebase.sample
     文件        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个文件信息

评论

共有 条评论