zoukankan      html  css  js  c++  java
  • ACE_Message_Block 学习

    本文参考http://www.cnblogs.com/TianFang/archive/2006/12/30/607960.html

    1. ACE_Message_Block 的length() 返回的是写指针和读指针之间的字符数量。如

    lb->wr_ptr(10);

    lb->rd_ptr(20);

    lb->length();   // -10

    2. ACE_Message_Block 下面的用法会和数组共用同一个内存块。释放时不释放数组。

    ACE_TCHAR buffer[100];
    ACE_Message_Block *b2 = new ACE_Message_Block(buffer,ACE_OS::strlen(buffer));
    ACE_OS::sprintf(b2->wr_ptr(),"%s","hello word");
    ACE_OS::printf("%s ",b2->rd_ptr());     --->hello word
    ACE_OS::printf("%s ",buffer);               --->hello word
    b2->release();
    //ACE_OS::printf("%s",b2->rd_ptr());     --->has excaption
    ACE_OS::printf("%s ",buffer);               --->hello word

    3. ACE_Message_Block 下面的用法会共用同一个内存块。通过引用计数的方式释放数据。

    ACE_Message_Block *b3 = new ACE_Message_Block(30);
    ACE_Message_Block *b4 = b3->duplicate();
    ACE_OS::sprintf(b3->wr_ptr(),"%s","hello word");
    ACE_OS::printf("%s ",b3->rd_ptr());  --->hello word
    ACE_OS::printf("%s ",b4->rd_ptr());  --->hello word

    ACE_OS::printf("reference_count %i ",b4->reference_count());  ---> 2
    b3->release();

    ACE_OS::printf("reference_count %i ",b4->reference_count());  ---> 1
    ACE_OS::printf("%s ",b4->rd_ptr());  --->hello word
    b4->release();
    ACE_OS::printf("%s ",b4->rd_ptr());  --->has excaption

    4. ACE_Message_Block下面的用法会进行深拷贝。

    ACE_Message_Block *b3 = new ACE_Message_Block(30);
    ACE_Message_Block *b4 = b3->clone();
    ACE_OS::sprintf(b3->wr_ptr(),"%s","hello word");
    ACE_OS::printf("%s ",b3->rd_ptr());  --->hello word
    ACE_OS::printf("%s ",b4->rd_ptr());  --->乱码

    ACE_OS::printf("reference_count %i ",b4->reference_count());  --->1
    b3->release();

    ACE_OS::printf("reference_count %i ",b4->reference_count());  --->1
    ACE_OS::printf("%s ",b4->rd_ptr());  --->乱码
    b4->release();
    ACE_OS::printf("%s ",b4->rd_ptr());  --->has excaption

    5.ACE_Message_Block 中copy的用法

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

    下面的例子演示了copy()函数的用法。

        mb->copy("hello");
        mb->copy("123",4);

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

    6.ACE_Message_Block 中可以将多个消息块连接起来

    ACE_Message_Block *b9 = new ACE_Message_Block(30);
    ACE_OS::sprintf(b9->wr_ptr(),"%s","hello");
    ACE_Message_Block *b10 = new ACE_Message_Block(30);
    ACE_OS::sprintf(b10->wr_ptr(),"%s","word");

    b9->cont(b10);

    ACE_OS::printf("b10 %s ",b9->cont()->rd_ptr());
    ACE_OS::printf("b10 %s ",b10->rd_ptr());

  • 相关阅读:
    ASP.NET AJAX 's UpdatePanel 中使用Page.ClientScript.RegisterStartupScript 失败
    从struct到byte[]之RawFormatter
    一个HTTP.二进制POST和HTTP指定长度接收的C++实现
    发现移动太NB了,验证码图像路径直接包含验证码
    又一个网页下载者木马
    Trojan program TrojanDownloader.JS.IstBar.ai 病毒样本
    用控件的方式解决问题在客户端关联WEB控件引用
    需要防范的XSS攻击
    用"指定字符组成的任意进制"转换生成不带4的卡号
    人为漏洞的构造、文件的载入、验证机制的突破
  • 原文地址:https://www.cnblogs.com/sunleinote/p/3687601.html
Copyright © 2011-2022 走看看