|
服务器端接受到一个ACE_Message_Block后放入了ACE_TASK中,但是从ACE_TASK取出来以后,发现ACE_Message_Block的数据块发生了变化,我的ACE_Message_Block大小为4096字节,是不是太大了
char buf[BUFFER_SIZE] = {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())后取得的数据正常,是因为前面你传入的引用是有效的,等你推入队列后,引用就失效了。 |
|