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 ...
随机推荐
- 生产者-消费者模型在Hudi中的应用
介绍 生产者-消费者模型用于解耦生产者与消费者,平衡两者之间的能力不平衡,该模型广泛应用于各个系统中,Hudi也使用了该模型控制对记录的处理,即记录会被生产者生产至队列中,然后由消费者从队列中消费,更 ...
- SpringBoot 项目脚手架
写在前面 之前也一直很少有写SpringBoot项目相关的文章,今天 准备整理一个我自己初始化SpringBoot项目时的一个脚手架,便于自己后面查阅.因为SpringBoot的约定大于配置,在整合各 ...
- 新闻实时分析系统-inux环境准备与设置
1.Linux系统常规设置 1)设置ip地址 项目视频里面直接使用界面修改ip比较方便,如果Linux没有安装操作界面,需要使用命令:vi /etc/sysconfig/network-scripts ...
- 选择了uniapp开发app
7月份打算做一简单app,之前公司做app的时候简单用过Dcloud公司的mui,当时由于uniapp刚出来,最终选择了mui.对uniapp的 了解几乎没有. 做app对我来说几乎是零基础的,当然是 ...
- socket解决编码解码问题
MySocket类: import socket class MySocket(socket.socket): # 继承自socket文件中的socket类,此时socket就是父类 def __in ...
- 自定制页面跳转时携带原搜索参数的URL
介绍 django自带反向解析生成URL的功能,目的是避免硬编码,较少代码维护的代价. 前端页面使用模板语法,如:{% url "rbac: request menu_list" ...
- .net core 学习 读取配置文件
在空项目中是没有配置文件的,首先要新建一个,配置文件内容如下,下面来读取各个内容 { "ConnectionStrings": { "DefaultConnection& ...
- Dictionary的遍历
Dictionary<string, int> list = new Dictionary<string, int>(); list.Add("d", 1) ...
- Tensorflow搭建CNN实现验证码识别
完整代码:GitHub 我的简书:Awesome_Tang的简书 整个项目代码分为三部分: Generrate_Captcha: 生成验证码图片(训练集,验证集和测试集): 读取图片数据和标签(标签即 ...
- C#中的委托和事件(二)
引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些大家常 ...