来到公司实习,开始面向实习生有一个小项目,当然了,服务器就由我一个人来写了,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++;
}
}
};

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

LINUX网络传输的序列化和反序列化C++的更多相关文章

  1. 带你了解Java的序列化与反序列化

    什么是序列化 序列化:将 Java 对象转换成字节流的过程. 什么是反序列化 反序列化:将字节流转换成 Java 对象的过程. 序列化的实现 当 Java 对象需要在网络上传输 或者 持久化存储到文件 ...

  2. Webservice SOAP传输序列化总结 以及webservice之序列化以及反序列化实例

    一.所有Webservice中传递的对象都必须能够序列化,这个是作为在网络之间传输的必要条件.XML WebService和SOAP标准支持的数据类型如下: 1.基本数据类型. 标准类型,如:int ...

  3. C#网络编程学习(6)---序列化和反序列化

    1.什么是序列化和反序列化 当客户端和服务器进行远程连接时,互相可以发送各种类型的数据.但都要先把这些对象转换为字节序列,才能在网络上进行传输. 序列化:就是发送方 把对象转换为字节序列的过程. 反序 ...

  4. linux网络环境下socket套接字编程(UDP文件传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  5. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  6. 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化

    [源码下载] 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化 作者:webabcd 介绍重新想象 Windows 8 Store Apps ...

  7. asp.net中对象的序列化,方便网络传输

    对象序列化 是将对象状态转换为可保持或传输的格式的过程.反序列化 是将流转换为对象序列化和反序列化相结合 可以使对象数据轻松的存储和传递 在 .NET 中,如果是对象可序列化,需要在 声明对象的开始部 ...

  8. Java之对象序列化和反序列化

    一.对象序列化和反序列化存在的意义: 当你创建对象,只要你需要,他就一直存在,但当程序结束,对象就会消失,但是存在某种情况,如何让程序在不允许的状态,仍然保持该对象的信息.并在下次程序运行的时候使用该 ...

  9. Java基础18:Java序列化与反序列化

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

随机推荐

  1. 面试官:关于Java性能优化,你有什么技巧

    通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化. 一般有两种方案:即优化代码或更改设计方法.我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性 ...

  2. 基于 HTML5 + WebGL 的地铁 3D 可视化系统

    前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...

  3. .Net Core3.0 WEB API 中使用FluentValidation验证,实现批量注入

    为什么要使用FluentValidation 1.在日常的开发中,需要验证参数的合理性,不紧前端需要验证传毒的参数,后端也需要验证参数 2.在领域模型中也应该验证,做好防御性的编程是一种好的习惯(其实 ...

  4. P1055 ISBN号码

    题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字.11位识别码和33位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位 ...

  5. docker配置mysql主从与django实现读写分离

    一.搭建主从mysql环境 1 下载mysql镜像 docker pull mysql:5.7 2 运行刚下载的mysql镜像文件 # 运行该命令之前可以使用`docker images`是否下载成功 ...

  6. 复习sed实例操作

    第6周复习课(5月2日) 课程内容: 复习 扩展1.打印某行到某行之间的内容http://ask.apelearn.com/question/5592.sed转换大小写 http://ask.apel ...

  7. ELK的简单搭建

    Environment  (都需要Java环境,jdk){ elasticsearch kibana 安装nginx用以测试 logstash } 1.首先拉取软件包,给予Java语言开发首选配置Ja ...

  8. KETTLE教程实战

    kettle初探 Kettle简介:Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定.Kettle 中文名称叫水壶,该项目的主程 ...

  9. 消息通知机制(NSNotification和NSNotificationCenter)

    作者:FlyElephant 出处:http://www.cnblogs.com/xiaofeixiang iOS中委托模式和消息机制基本上开发中用到的比较多,一般最开始页面传值通过委托实现的比较多, ...

  10. [TimLinux] Python 模块

    1. 概念 模块是最高级别的程序组织单元,它将程序文件和数据封装起来以便重用.实际上,模块往往对应Python文件,每一个文件都是一个模块,并且模块导入其他模块之后就可以使用导入模块定义的变量,模块和 ...