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++;
}
}
};
其实用法不然,感觉还是理解方面,就是通过不同的字节,存储不同的信息,比如用前四字节存储类型,然后以此类推,不知道对还是不对,总之是实现了。
LINUX网络传输的序列化和反序列化C++的更多相关文章
- 带你了解Java的序列化与反序列化
什么是序列化 序列化:将 Java 对象转换成字节流的过程. 什么是反序列化 反序列化:将字节流转换成 Java 对象的过程. 序列化的实现 当 Java 对象需要在网络上传输 或者 持久化存储到文件 ...
- Webservice SOAP传输序列化总结 以及webservice之序列化以及反序列化实例
一.所有Webservice中传递的对象都必须能够序列化,这个是作为在网络之间传输的必要条件.XML WebService和SOAP标准支持的数据类型如下: 1.基本数据类型. 标准类型,如:int ...
- C#网络编程学习(6)---序列化和反序列化
1.什么是序列化和反序列化 当客户端和服务器进行远程连接时,互相可以发送各种类型的数据.但都要先把这些对象转换为字节序列,才能在网络上进行传输. 序列化:就是发送方 把对象转换为字节序列的过程. 反序 ...
- linux网络环境下socket套接字编程(UDP文件传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- linux网络编程-(socket套接字编程UDP传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化
[源码下载] 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化 作者:webabcd 介绍重新想象 Windows 8 Store Apps ...
- asp.net中对象的序列化,方便网络传输
对象序列化 是将对象状态转换为可保持或传输的格式的过程.反序列化 是将流转换为对象序列化和反序列化相结合 可以使对象数据轻松的存储和传递 在 .NET 中,如果是对象可序列化,需要在 声明对象的开始部 ...
- Java之对象序列化和反序列化
一.对象序列化和反序列化存在的意义: 当你创建对象,只要你需要,他就一直存在,但当程序结束,对象就会消失,但是存在某种情况,如何让程序在不允许的状态,仍然保持该对象的信息.并在下次程序运行的时候使用该 ...
- Java基础18:Java序列化与反序列化
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
随机推荐
- Openlayers ol.interaction.Select取消默认选中效果
说明: 在使用ol.interaction.Select进行点击查询时,默认会把点击选中的要素显示在地图上 我的需求是做轨迹回放,并可以点击轨迹上某一点,进行查询.这时候如果重新播放轨迹,会发现这个选 ...
- Openlayers Overlay导致偏移
说明: 在做项目过程中,用overlay做了一个infowindow弹窗,但是在使用过程中发现一个bug:overlay.setPosition以后,会出现偏移,但是拖动一下地图或者点击一下地图其他地 ...
- Swoft 源码剖析 - Swoole和Swoft的那些事 (Http/Rpc服务篇)
前言 Swoft在PHPer圈中是一个门槛较高的Web框架,不仅仅由于框架本身带来了很多新概念和前沿的设计,还在于Swoft是一个基于Swoole的框架.Swoole在PHPer圈内学习成本最高的工具 ...
- 都是为了生活组——‘’都是为了吃饭”微信小程序评价
基于NABCD评论作品,及改进建议 1.根据NABCD评论,作品的选题 N(Need,需求) 纠结症是目前在年轻人身上普遍存在着的问题,食堂食物众多,每次在吃饭前都要纠结好久,大大浪费了时间,还容易产 ...
- 如何配置tomcat的环境变量
如何配置tomcat的环境变量 安装好tomcat之后, 按照这个操作,计算机→属性→高级系统设置→高级→环境变量,打开环境变量设置框. 以本人的tomcat 8.0为例:安装下来如图 那么我的tom ...
- Java流程控制之(二)循环
目录 while循环 do..while循环 for循环 while循环和for循环基本概念--直接上代码! while循环 int i = 0; while(i<10) { System.ou ...
- 经典算法之K近邻(回归部分)
1.算法原理 1.分类和回归 分类模型和回归模型本质一样,分类模型是将回归模型的输出离散化. 一般来说,回归问题通常是用来预测一个值,如预测房价.未来的天气情况等等,例如一个产品的实际价格为500元, ...
- python文件高级操作
python文件高级操作和注意事项等等 文件过大保护 由于read是一次性读取文件所有的内容,如果文件100G,内存就会吃不消,所以推荐使用read(size)一次读取指定字节/字符(根据rb,或者r ...
- python中random的基本用法
那么怎么使 a 随机生成一个数值呢,来研究一下random的部分程序:python中random模块的几个函数可以随机生成数值,下面咱们看一下random的几个函数的使用方法. random()是不能 ...
- tensorflow学习笔记——AlexNet
1,AlexNet网络的创新点 AlexNet将LeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中.AlexNet主要使用到的新技术点如下: (1)成功使用ReLU作为CNN的激活函 ...