来到公司实习,开始面向实习生有一个小项目,固然了,服务器就由我一我的来写了,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;
}spa
//序列化函数string
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);class
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++;
}
}
};
其实用法否则,感受仍是理解方面,就是经过不一样的字节,存储不一样的信息,好比用前四字节存储类型,而后以此类推,不知道对仍是不对,总之是实现了。