ACE_Message_Block数据块问题
服务器端接受到一个ACE_Message_Block后放入了ACE_TASK中,但是从ACE_TASK取出来以后,发现ACE_Message_Block的数据块发生了变化,我的ACE_Message_Block大小为4096字节,是不是太大了char buf = {0};
memcpy(buf, mb->rd_ptr(), BUFFER_SIZE);
我是用上面的方法来读取ACE_Message_Block的数据,发现每次读取的数据前面一段是正常的,但是后面一段就不是原来的数据了。而且后面那一段的数据是固定的。但是在我没有把ACE_Message_Block放入ACE_TASK之前,用memcpy(buf, mb->rd_ptr(), BUFFER_SIZE)方法读取的数据是正常的,不知道是什么原因
我用memcpy(buf, mb->rd_ptr(), mb->length())读取的数据也是同样的问题,难道在ACE_Message_Block进入ACE_TASK后数据块有变动?我的ACE_Message_Block是这样初始化的:
ACE_NEW_RETURN(mb, ACE_Message_Block(msg_len, ACE_Message_Block::MB_DATA, 0, msg), -1);
mb->wr_ptr(msg_len);
putq(mb);
在这时memcpy(buf, mb->rd_ptr(), mb->length())后取得的数据正常。但是在
ACE_Message_Block *mb = NULL;
getq(mb);
在这时memcpy(buf, mb->rd_ptr(), mb->length())取得的数据就不对了,我试了试改变ACE_Message_Block的大小,但是还是同样的问题,前一段数据正常,后一段数据不是我要的数据,而且取出来的后一段数据都是一样的。
希望各位帮帮忙,谢谢
---------------------------------
4096是你分配的ACE_Message_Block尺寸,是size(),真正的数据是length(),你估计混淆了两者的不同。
个人意见:
你用的ACE_Message_Block构造函数不对,这个构造函数,你传入的msg是使用引用的方式,并不是在内部分配数据,并给你复制过去。
你下面的代码:
mb->wr_ptr(msg_len)毫无用处,根本不需要调用,你使用复制函数,内部会自动设置。
改成:
ACE_NEW_RETURN(mb,ACE_Message_Block(msg_len),-1);
mb->copy(msg,msg_len);
ACE_Task不会修改你存储到队列的任何数据 - 这样完全不符合设计思想。默认情况下,它会忠实的复现你推入的数据,所以一定是你
推入的数据出错了,才导致你后面取得的数据是错误的。
你memcpy(buf, mb->rd_ptr(), mb->length())后取得的数据正常,是因为前面你传入的引用是有效的,等你推入队列后,引用就失效了。 我现在改了,ACE_Message_Block数据块没有申请空间。
char * msg = new char;
ACE_NEW_RETURN(mb, ACE_Message_Block(msg, msg_len), -1);
这样以后再从ACE_TASK里取出来的数据就是正确的了。还是不明白是为什么... 你看一下ACE手册上面的说明就会明白了。手册在本站能下载,资料频道。
你的这个写法:
ACE_NEW_RETURN(mb, ACE_Message_Block(msg, msg_len), -1);
消息块只引用了msg的指针,如果你在ACE_Task取出处理的时候,保证了没有删除它引用的指针,它自然是有效的。
如果你删除了msg指针的内容,就会崩溃了。不信可以测试一下。
页:
[1]