來到公司實習,開始面向實習生有一個小項目,固然了,服務器就由我一我的來寫了,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++;
}
}
};
其實用法否則,感受仍是理解方面,就是經過不一樣的字節,存儲不一樣的信息,好比用前四字節存儲類型,而後以此類推,不知道對仍是不對,總之是實現了。