• LINUX网络传输的序列化和反序列化C++


    来到公司实习,开始面向实习生有一个小项目,当然了,服务器就由我一个人来写了,1.0主要完成的使用纯C 写Linux下UDP的服务器框架,大部分还都是以前在学校做过的项目套用的,难度不大,经过跟大boss讨论,版本2.0决定引入类,然后改用TCP进行传输,但是突然转变成C++还是有些不适应,虽然引入了类,但是还是过多的引用字符数组,大boss要求,3.0全面改成string 的C++风格,应用STL。这下就麻烦了,因为有一个问题,类型string 是没办法直接进行网络进行传输的,或者是我不会,反正定义的报文应用的内联,没办法将带构造函数的类放进去。3.0的改动就是把所有的报文全部改成了消息类(例如 登陆请求消息类,登陆应答消息类),类中包括所需要传输的数据,但是如果真要 应用send函数发送出去,还得需要将该消息类进行序列化进一个buf中,才能被发送。

    代码:

    //登录请求类
    class Req_Login : public Req{
    private:
    string login_name;
    string login_psw;
    public:
    int GetDatesize()
    {//报文类型(4字节),所有数据长度int表示(4字节),每一个成员包括,数据长度(int型 4字节)+数据真实长度,string.size()获得,

    //3的含义是int型总体长度,int型login_name的长度,int 型的login_psw的长度。

    size = sizeof(unsigned int)*3+sizeof(req_type)+

    login_name.size()+login_psw.size();
    return size;
    }
    void SetDate(string name,string psw){
    login_name = name;
    login_psw = psw;
    }
    string GetDateName()
    {
    return login_name;
    }
    string GetDatePsw()
    {
    return login_psw;
    }
    void SetType(c2s_req_type type)
    {
    req_type = type;
    }

    //序列化函数

    void inorder(char * buf){
    char * order = buf;
    int ordersize = 0;
    memcpy((void *)order,(void *)&req_type,sizeof(int));
    order+=sizeof(req_type);
    memcpy((void*)order,(void *)&size,sizeof(int));
    order+=sizeof(int);

    ordersize = login_name.size();
    memcpy((void*)order,(void *)&ordersize,sizeof(int));
    order+=sizeof(int);
    memcpy((void*)order,(void *)login_name.c_str(),login_name.size());
    order+=login_name.size();

    ordersize = login_psw.size();
    memcpy((void*)order,(void *)&ordersize,sizeof(int));
    order+=sizeof(int);
    memcpy((void*)order,(void *)login_psw.c_str(),login_psw.size());
    order+=login_psw.size();

    }

    //反序列话函数
    void outorder(char * buf,int size){
    char * order = buf;
    int length = 0;
    int allength = 0;
    login_name.clear();
    login_psw.clear();

    memcpy((void*)&length,(void *)order,sizeof(int));
    order+=sizeof(int);
    allength+=length;
    for(int i = 0;i < length;i++)
    {
    if(allength >= size)
    return ;
    login_name += (*order);
    order++;
    allength++;
    }

    memcpy((void*)&length,(void *)order,sizeof(int));
    order+=sizeof(int);
    allength+=length;
    for(int i = 0;i < length;i++)
    {
    if(allength >= size)
    return ;
    login_psw += (*order);
    order++;
    allength++;
    }
    }
    };

    其实用法不然,感觉还是理解方面,就是通过不同的字节,存储不同的信息,比如用前四字节存储类型,然后以此类推,不知道对还是不对,总之是实现了。

  • 相关阅读:
    存储过程使用收集
    网站伪静态技术(网页伪静态化)
    鼠标拖动层
    Oracle系统中用户权限的赋予,查看和管理(3)
    数据库中的锁查询及相关关系
    undo 管理
    grant 和 REVOKE权限
    Oracle系统中用户权限的赋予,查看和管理(2)
    了解数据库不同启动
    Oracle系统中用户权限的赋予,查看和管理(注意点)(4)
  • 原文地址:https://www.cnblogs.com/zhaosc-haha/p/5060089.html
Copyright © 2020-2023  润新知