网狐棋牌框架-WHDataQueue队列的问题

本站除永久心友群外无交流群,咨询联系客服1162960886,本站资源免费咨询,若需远程协助收费解决!
下方详情页可能有视频教程哦 本站特价云服务器网址xyunpan.cn,永久心友尽享八折优惠
内页广告

研究网狐的内核框架发现经常有以下错误:

int nIndex = 0;		TCHAR szInfo[4096] = TEXT("");		int nLen = 0;				//写入0字节, 让gDataQueue内存块大小为 40, 实际上是写入4字节,因为里面还有个数据头		rand_str(szInfo, 0);		gDataQueue.InsertData(++nIndex, szInfo, 0);		tagDataHead head;		//取出,之后 m_dwDataQueryPos 变成4		gDataQueue.DistillData(head, szInfo, sizeof(szInfo));		//写入16个字节		rand_str(szInfo, 7);		nLen = CountStringBuffer(szInfo);		gDataQueue.InsertData(++nIndex, szInfo, nLen);		std::cout << nLen <<", " << nIndex << endl;		//取出,之后 m_dwDataQueryPos 变成24, m_dwDataSize=0		gDataQueue.DistillData(head, szInfo, sizeof(szInfo));		std::cout << head.wDataSize << ", " << head.wIdentifier<< endl;		std::cout << "" << endl;		//写入20字节, 		//因为写入到结束位置,写入位置+写入长度大于总长,查询位置大于写入长度,		//基于以上三点原因,说明可以写从头开始再入,所以会把 m_dwInsertPos 设置为0		rand_str(szInfo, 9);		nLen = CountStringBuffer(szInfo);		gDataQueue.InsertData(++nIndex, szInfo, nLen);		std::cout << nLen << ", " << nIndex << endl;		//再写入10字节		rand_str(szInfo, 3);		nLen = CountStringBuffer(szInfo);		//写入10字节之后, 		//实际上gDataQueue就变成m_dwDataQueryPos = 24(因为没有读取操作)		//m_dwDataSize = 38, m_dwInsertPos = 38		//到这一步貌似也还没有问题,但是如果后续的操作不是读取而是继续写入,那么就有出现问题		gDataQueue.InsertData(++nIndex, szInfo, nLen);		std::cout << nLen << ", " << nIndex << endl;		rand_str(szInfo, 28);		nLen = CountStringBuffer(szInfo);		//为了测试问题,这一步继续写入,因为总长是40,再写入,则会重新分配空间		//重新分配空间时,需要将原有内存数据拷贝到新内存,问题就出现这个拷贝上,步骤如下:		//1. 判断是否存在末尾还有未读完的数据:m_dwTerminalPos-m_dwDataQueryPos=14		//2. 先将末尾数据拷贝:CopyMemory(pNewQueueServiceBuffer, m_pDataQueueBuffer + m_dwDataQueryPos, dwPartOneSize);		//3. 再从头开始拷贝:CopyMemory(pNewQueueServiceBuffer + dwPartOneSize, m_pDataQueueBuffer, m_dwInsertPos);		//这个步骤理论上是没有错的,但是结合上面的写入数据的顺序,则忽略了一个细节: 写入的数据长度已经覆盖了查询标记		gDataQueue.InsertData(++nIndex, szInfo, nLen);		std::cout << nLen << ", " << nIndex << endl;		std::cout << "" << endl;		gDataQueue.DistillData(head, szInfo, sizeof(szInfo));		std::cout << head.wDataSize << ", " << head.wIdentifier << endl;		gDataQueue.DistillData(head, szInfo, sizeof(szInfo));		std::cout << head.wDataSize << ", " << head.wIdentifier << endl;		gDataQueue.DistillData(head, szInfo, sizeof(szInfo));		std::cout << head.wDataSize << ", " << head.wIdentifier << endl;
try	{		//缓冲判断		if ((m_dwDataSize+dwNeedSize)>m_dwBufferSize) throw 0;		//重新开始		if ((m_dwInsertPos==m_dwTerminalPos)&&((m_dwInsertPos+dwNeedSize)>m_dwBufferSize))		{			if (m_dwDataQueryPos>=dwNeedSize) m_dwInsertPos=0;			else throw 0;		}		//缓冲判断		if ((m_dwInsertPos<m_dwTerminalPos)&&((m_dwInsertPos+dwNeedSize)>m_dwDataQueryPos)) throw 0;				//头追上尾或尾追上头		if (m_dwInsertPos + dwNeedSize > m_dwDataQueryPos && m_dwDataQueryPos >= m_dwInsertPos)		{			//尾追上头			if (m_dwDataSize > 0) throw 0;		}			}
版权声明

1 本网站名称:心游灵犀源码网
2 本站永久网址:http://xinygame.cn
3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
7 棋牌类源码仅供会员学习使用,切勿用于商用及违法用途。否侧需自行承担相应后果,反赌反诈专用!!!
8 如果有侵权,请联系站长删除相关内容!

 
 
© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容