网络数据的打包(pack)

本文介绍了在Socket编程中如何对原始数据进行打包处理,包括未压缩数据的直接打包和压缩后的数据打包两种情况,并提供了具体的实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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在另外一编技术文章中有介绍
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值