zoukankan      html  css  js  c++  java
  • 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++;
    }
    }
    };

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

  • 相关阅读:
    准备工作
    使用awstats分析nginx日志
    kvm虚拟化环境中的时区设置
    使用awk格式化输出文本
    gitlab(7.9)升级到8.0.1
    为openstack制作CoreOS虚拟机镜像(基于CoreOS官方提供镜像)
    KVM虚拟化之嵌套虚拟化nested
    编译制作Linux 3.18内核rpm包(升级centos6.x虚拟机内核)
    Linux主机之间传输文件的几种方法对比
    spice在桌面虚拟化中的应用系列之二(Linux平台spice客户端的编译安装,支持USB映射)
  • 原文地址:https://www.cnblogs.com/zhaosc-haha/p/5060089.html
Copyright © 2011-2022 走看看