真心想不好了,我先简单描述案件的过程
我有个4096大的空间,有一天张三要长期在租用.....他存的是单号和物品都是连续在一起的.....
好了进入正题,是这样的,远程不断发送数据
OnReceive 是用别人的模块 pdata 是一次性过来的数据 iLength 是数据长度
远程的数据格式是 头文件5个字节后面是数据紧接又是头文件5个字节后面是数据
这样有时候是一个体(我们这里把 头文件5个字节后面是数据 称为一个体)有时候有10个体
他是不固定的但是结构都是一样的
由于整体长度不是固定的,所以我没办法定义 buff的大小 所以我只能把pdata用4096来切割,或者1024长度切割
full(); //这个是分析数据
OnReceive(IClient* pClient, const BYTE* pData, int iLength) 这个是切割数据 将切割的数据放入buff里 因为这个是主接受数据的
我现在逻辑上跟不上,不知道怎么去写,我自己想假如数据5000,这时候拷贝4096 还剩余904 ,
而恰好 头文件5个字节后面是数据 取出了 4000个字节 那么还剩下 96个 那这个96个移动到904的前面 重新拷贝到 buff里
整体这逻辑上就写不好了,总是写出内存溢出 用 memcpy(buff ,pData , 长度 )
求大侠帮我这个思路写下
***.h
char buff[4096];
int m_ncurlen;
***.cpp
EnHandleResult XXXX::OnReceive(IClient* pClient, const BYTE* pData, int iLength)
{
//pData 数据 iLength 长度
m_ncurlen = iLength; //总的数量
memset(buff, 0, 4096);
for (;;) //永无止境的工作
{
//这个是我自己写的,但是总是出错
if ( m_ncurlen >4096 )
{
memcpy(buff, pData , 4096 );
full();
}else
{
memcpy(buff,pData,长度);
full();
}}
}
full()
{
//这里是处理 buff 的数据 将 头文件5个字节后面是数据 分出来 也是个循环,当buff里数据不足读取的时候退出去,重新拷贝数据到buff里
}
------解决思路----------------------
头文件5个字节后面是数据 你的一个体是否定长?
不过, 不管定不定长, 你都可以这么来解析.
除了buff,需要另定义一个buff2, 和一个长度len2, buff2是用来保存不满一个"体"的数据.
每次OnReceive 收到iLength数据后,
先看buff2中是否有上次不满一个"体"的数据缓存. 如果有, 则把buff2中的数据先复制到buff中, 然后再接收前一个"体"未接收完的数据.
每次从pData复制一个"体"的数据到buff 中, 然后处理一个"体", 直到pData中的数据不足一个体, 则把这些数据缓存到buff2中,并记录长度到len2中, 继续下一次接收.
------解决思路----------------------
我看楼主话都说不清楚,先把话说的没有歧义吧