简单缓存处理---UDT


UDT安全传输文件虽然传输速度等方面使用很方便,但是还是有一个重要的问题,就是流协议处理用起来不是很方便,比如直接传输一块大的数据流,做为传输层,需要他有和TCP一样的功能,我给你多大块数据,你要最后抛出多大的数据,如何总是先发送数据的大小,然后再根据大小来接收,还是有很大的局限性的。因此给他再增加一个组包的缓存区是很有必要的。

开始想了几个方法,先实现了一个比较简单的。就是解包后直接new char【数据的大小】 然后不断的接收 ,直到数据接收完全后抛到上层。

具体思想是1. 收到一组数据,然后解包,比较数据和整块数据大小,如果小数据流就这接解包抛到上层,这里可能都是小包,那么就需要一个循环解包,如果解到一半数据不够,

就需要先拷贝这一部分数据到里面,然后记录下整块数据的大小和已经收到的大小。记录一个状态,是组合中还是不是组合中。

2.再次收到数据如果是组合中,就直接到2处理,首先比较has_read + size是否大于或者等于整块数据的大小,如果是直接拼成一个包然后抛到上层,并且更改状态,然后看看这次收到的数据是否处理完,如果没处理完,转到1处理。如果has_read+size小于整块数据的大小,那么就简单啦,直接拷贝数据到缓存,然后接着等数据。


就这么多,注意要点一、数据结构处理,结构体中getdate() 操作,如

struct  Pack
{
   int packlen;
   int datalen;
   char* getdata()
   {
       return (char*)(this + 1);
   }
}
涉及到getdata()一定是要堆栈上处理数据,所以要先new char ,然后改变类型,然后再处理。如果不这样,会直接报错,破坏堆栈。

二、堆栈对象处理,m_pData移动增加数据,一是建立中间变量去拷贝,一个是直接m_pData + nHas_read,总之一点就是确定位置然后拷贝。主变量的位置不可以移动,否则直接影响delete回收对象。这个很重要。


简单例子里面主要用到了boost库中的bind绑定操作,function回调机制。智能指针share_ptr和make_shared。减少代码量,boost库刚开始用,还需要多多练习。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值