网络数据的打包(pack)

  http://bbs.csai.cn/bbs/view.asp?id=%7B7D79B044-B471-4E15-B837-88196EEFDC15%7D
在socket编程的时候,数据的传输一般都经过封装打包才发送到另一端。打包一般都是加入一些额外的信息到raw data中,比如包头一般都加入raw data的前面。包头的大小一般都是比较小的(一般为四字节大小),下面举一个例子,来看看raw data是怎么打包的:
/*
*下面这个例子1数据是没有经过压缩的,只是把原始的数据直接打包而已。
*/
template<typename buffer_type>
unsinged int packetData(const void *pData, const unsigned int nLen, buffer_type &cmd_queue)
{
unsigned int nSize = nLen > MAX_DATASIZE ? MAX_DATASIZE : nLen;
unsigned int nMask = 0;
cmd_queue.wr_reserve(nSize + PH_LEN);
bcopy(pData, &(cmd_queue.wr_buf()[PH_LEN]), nSize);
(*(unsigned int *)cmd_queue.wr_buf()) = (nSize | nMask);//包头用来存储原始数据的大小
cmd_queue.wr_flip(nSize + PH_LEN);
return nSize + PH_LEN;
}
/*
*下面的例子数据经过压缩的。
*/
template<typename buffer_type>
unsinged int packetDataZip(const void *pData, const unsigned int nLen, buffer_type &cmd_queue, const bool _compress)
{
unsigned int nSize = nLen > MAX_DATASIZE ? MAX_DATASIZE : nLen;
unsigned int nMask = 0;
if(nSize >= PACKET_ZIP_MIN && _compress)
{
uncompress_size += nSize;
uLong nZipLen = unzip_size(nSize);
cmd_queue.wr_reserve(nZipLen + PH_LEN);
int retcode  = compress2_ze(&(cmd_queue.wr_buf()[PH_LEN]), &nZipLen, (const Bytef *)pData, nSize);//compress2_ze(Bytef *dest, uLongf *destLen, const Bytef *source, unsinged long sourceLen, int level);
switch(retcode)
{
//错误处理
}
nSize = nSizeLen;
compressed_size += nSize;
nMask |= PACKET_ZIP;
}
else
{
nocompress_size += nSize;
cmd_queue.wr_reserve(nSize + PH_LEN);
bcopy(pData, &(cmd_queue.wr_buf()[PH_LEN]), nSize);
}
(*(unsigned int *)cmd_queue.wr_buf()) = (nSize | nMask);//包头用来存储原始数据的大小
cmd_queue.wr_flip(nSize + PH_LEN);
return nSize + PH_LEN;
}
备注1:buffer_type是缓冲队列类型,其定义以及操作在另外一编技术文章中。其中PH_LEN是包头的大小,其定义为:#define PH_LEN  (sizeof(unsigned int))。参数nLen是要打包的原始长度。在这里,我向提一下一个c语言的基本知识点:在理解指针的时候,应该记住内存并不包含任何与之相关联的内在的解析,只有通过使用一个特定类型的指针拿一个特殊位置的比特才能解析为有意义的数据。
备注2:unzip_size在另外一编技术文章中有介绍

你可能感兴趣的:(编程,网络,socket,cmd,存储,buffer)