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

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

最新文章

  1. Jenkins 2.16.3默认没有Launch agent via Java Web Start,如何配置使用
  2. Linux网路编程系列-网络I/O模型
  3. Encode &amp; decode
  4. 基础组件_Window(窗口)
  5. Cocos2d-x中播放背景音乐
  6. 阿里云 centos vim 显示中文 乱码
  7. Vlc for Android 全面阐述
  8. javascript 动态创建表格
  9. SQL入门学习2-聚合与排序
  10. 《JavaScript设计模式与开发实践》知识点笔记
  11. java 重载、重写、重构的区别
  12. 如何利用cURL和python对服务端和web端进行接口测试
  13. 帝国cms添加修改会员字段时字段名不能带数字,否则注册页会出现空白
  14. jQuery_ajax请求超时
  15. 微信小程序制作家庭记账本之五
  16. Utils--Cookie工具类
  17. Max(rowid)是否走B树索引
  18. 一、Jmeter环境介绍
  19. zTree实现节点修改的实时刷新
  20. Notepad++ 删除空白行的方法

热门文章

  1. PL真有意思(五):数据类型
  2. 【2018寒假集训 Day2】【动态规划】钱币兑换(exchange)(自己翻译的2333)
  3. day 23 面向对象中类的成员 和嵌套
  4. Java基础-Java基本语法
  5. java.lang.IllegalArgumentException: A null value cannot be assigned to a primitive type
  6. 2019年12月4日Linux开发手记
  7. c 语言I博客作业02
  8. SpringBoot和SpringCloud的版本对应关系
  9. 【洛谷P1835】素数密度
  10. JAVA学习第一课-手工笔记