每个ACE_Message_Block都有两个底层指针:rd_prt,wr_ptr,用于在消息块中读写数据。可以通过rd_ptr()和wr_ptr()方法来直接访问。
rd_ptr指向下一次读取数据的位置,wr_ptr指向下一次写入数据的位置。这两个指针不会自动更新,程序员必须自己来增加他们的值!!!
拷贝函数 int copy(const char *buf,size_t n); buf指向要拷贝进消息块的缓冲区的指针,n指要拷贝数据的大小,该方法从wr_ptr指向的位置开始往前 写,并且保证wr_ptr的更新,使其指向缓冲区的新末尾处。
base()和length()方法可以联合使用,以将消息块中的整个数据缓冲区拷贝出来。
base()返回指向数据块的第一个数据条目的指针,
length()返回队中数据的总大小。 base和length相加,可以得到指向数据块末尾的指针。
duplicate()和clone()方法用于制作消息块的“副本“。
clone()方法实际的创建整个消息块的新副本,包括他的数据块和附加部分。
duplicate()方法使用ACE_Message_Block的引用计数机制,返回指向要被复制的消息块的指针,并在内部增加内部引用计数。
release()释放消息块 ,如果消息数据内存石油该消息块分配的,调用release()方法就会释放此内存。如果消息块是引用计数的,release()就会减少计数,直到0为止。
ACE_Message_Block* mb = new ACE_Message_Block(BUFSIZ);
mb->copy(buff); //buff先已经初始化
2.1
ACE_Message_Block* mb = new ACE_Message_Block(buff,len);
mb->wt_ptr(len); //len是buff的长度 len = strlen(buff) +1
// +1 表示后面的/0
ACE_Message_Block* mb = new ACE_Message_Block(BUFSIZ);
ACE_OS::sprintf(mb->wt_ptr(),buff);
mb->wt_ptr(len);
ACE_Message_Block* mb = new ACE_Message_Block(len,
ACE_Message_Block::MB_DATA,
mb2, //表示 mb->cont(mb2)
buff)
mb->wt_ptr(len);
mb->cont(mb2);
mb2->cont(mb3); //ok
***mb3->cont(mb); //死定了
ACE_Message_Block* lastMsg =ACE_Message_Block ,ACE_Message_Block::MB_STOP)
otherTask在接收到的时候如下处理