ACE_Message_Block功能简介


ACE_Message_Block在Ace中用来表示消息的存放空间,可用做网络通信中的消息缓冲区,使用非常频繁,下面将在如下方简单的介绍一下ACE_Message_Block相关功能。

  1. 创建消息块
  2. 释放消息块
  3. 从消息块中读写数据
  4. 数据的拷贝
  5. 其它常用函数

一、创建消息块

创建消息块的方式比较灵活,常用的有以下几种方式 :

1. 直接给消息块分配内存空间创建。

  1. ACE_Message_Block *mb = new ACE_Message_Block (30);  
  ACE_Message_Block *mb = new ACE_Message_Block (30);

2.  共享底层数据块创建。

  1. char buffer[100];  
  2. CE_Message_Block *mb = new ACE_Message_Block (buffer,30);  
     char buffer[100];
    ACE_Message_Block *mb = new ACE_Message_Block (buffer,30);

这种方式共享底层的数据块,被创建的消息块并不拷贝该数据,也不假定自己拥有它的所有权。在消息块mb被销毁时,相关联的数据缓冲区data将不会被销毁这是有意义的:消息块没有拷贝数据,因此内存也不是它分配的,这样它也不应该负责销毁它。

3. 通过duplicate()函数从已有的消息块中创建副本。

  1. ACE_Message_Block *mb = new ACE_Message_Block (30);  
  2.  ACE_Message_Block *mb2 = mb->duplicate();  
   ACE_Message_Block *mb = new ACE_Message_Block (30);
    ACE_Message_Block *mb2 = mb->duplicate();

这种方式下,mb2和mb共享同一数据空间,使用的是ACE_Message_Block的引用计数机制。它返回指向要被复制的消息块的指针,并在内部 增加内部引用计数

4. 通过clone()函数从已有的消息块中复制。

  1. ACE_Message_Block *mb = new ACE_Message_Block (30);  
  2. ACE_Message_Block *mb2 = mb->clone();  
    ACE_Message_Block *mb = new ACE_Message_Block (30);
    ACE_Message_Block *mb2 = mb->clone();

clone()方法实际地创建整个消息块的新副本, 包括它的数据块和附加部分 ;也就是说,这是一次" 深拷贝 "。

二、释放消息块

一旦使用完消息块,程序员可以调用它的release()方法来释放它。

  1. 如果消息数据内存是由该消息块分配的,调用release()方法就也会释放此内存。
  2. 如果消息块是引用计数的,release()就会减少计数,直到到达0为止;之后消息块和与它相关联的数据块才从内存中被移除。
  3. 如果消息块是通过共享已分配的底层数据块创建的,底层数据块不会被释放。
无论消息块是哪种方式创建的,只要在使用完后及时调用release()函数,就能确保相应的内存能正确的释放。

三、从消息块中读写数据

ACE_Message_Block提供了两个指针函数以供程序员进行读写操作,rd_ptr()指向可读的数据块地址,wr_ptr()指向可写的数据块地址,默认情况下都执行数据块的首地址。下面的例子简单了演示它的使用方法。

  1. #include "ace/Message_Queue.h"  
  2. #include "ace/OS.h"  
  3.   
  4. int main(int argc, char *argv[])   
  5. {  
  6.     ACE_Message_Block *mb = new ACE_Message_Block (30);  
  7.     ACE_OS::sprintf(mb->wr_ptr(),"%s","hello");  
  8.     ACE_OS::printf("%s\n",mb->rd_ptr ());  
  9.     mb->release();  
  10.     return 0;   
  11. }  
#include "ace/Message_Queue.h"
#include "ace/OS.h"

int main(int argc, char *argv[]) 
{
    ACE_Message_Block *mb = new ACE_Message_Block (30);
    ACE_OS::sprintf(mb->wr_ptr(),"%s","hello");
    ACE_OS::printf("%s\n",mb->rd_ptr ());
    mb->release();
    return 0; 
}

注意:这两个指针所指向的位置并 不会自动移动 ,在上面的例子中,函数执行完毕后,执行的位置仍然是最开始的0,而不是最新的可写位置5,程序员需要通过 wr_ptr(5) 函数手动移动写指针的位置。

四、数据的拷贝

一般的数据的拷贝可以通过函数来实现数据的拷贝,copy()还会保证wr_ptr()的更新,使其指向缓冲区的新末尾处。

  1. mb->copy("hello");  
  2. mb->copy("123",4);  
    mb->copy("hello");
    mb->copy("123",4);
注意:由于c++是以'\0'作为字符串结束标志的,对于上面的例子,底层数据块中保存的是 "hello\0123\0" ,而用 ACE_OS::printf("%s\n",mb->rd_ptr ()); 打印出来的结果是 "hello" ,使用copy函数进行字符串连接的时候需要注意。

五、其它常用函数

  1. length()    返回当前的数据长度
  2. next()    获取和设置下一个ACE_Message_Block的链接。(用来建立消息队列非常有用)
  3. space()    获取剩余可用空间大小
  4. size()    获取和设置数据存储空间大小。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值