找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3469|回复: 2

关于Message_Block的一些问题

[复制链接]
发表于 2008-1-15 21:57:18 | 显示全部楼层 |阅读模式
写了如下程序,
  1. #include "ace/OS.h"
  2. #include "ace/ACE.h"
  3. #include "ace/Message_Block.h"
  4. #include "ace/Log_Msg.h"
  5. #pragma pack(1)
  6. struct Head
  7. {
  8.   int status;
  9.   short seq;
  10.   char name[20];
  11. };
  12. #pragma pack()
  13. int
  14. main(void)
  15. {
  16.   ACE_Message_Block *mblk = new ACE_Message_Block (sizeof (Head) * 4);
  17.   Head First_Head;
  18. First_Head.status = 0;
  19.   First_Head.seq = 12456;
  20.   ACE_OS::strcpy(First_Head.name, "Lien.C");
  21.   mblk->copy((char*)&First_Head, sizeof (Head));
  22.   ACE_DEBUG((LM_DEBUG, "Message Block Size = %d\n", mblk->size()));
  23.   Head Second_Head;
  24.   mblk->copy((char*)&First_Head, sizeof (Head));
  25.   ACE_OS::memcpy(&Second_Head, mblk->rd_ptr(), sizeof Second_Head);
  26.   Head Third_Head;
  27.   mblk->rd_ptr(sizeof (Head) * 2);
  28.   ACE_OS::strcpy(First_Head.name, "中华人民共和国");
  29.   mblk->copy((char*)&First_Head, sizeof (Head));
  30.   ACE_OS::memcpy(&Third_Head, mblk->rd_ptr(), sizeof Second_Head);
  31.   
  32.   
  33.   ACE_DEBUG((LM_DEBUG, "Message Block Size = %d\n", mblk->space()));
  34.   
  35.   ACE_DEBUG((LM_DEBUG, "Second_Head Infomation: name - %s\n", Second_Head.name));
  36.   ACE_DEBUG((LM_DEBUG, "Third_Head Infomation: name - %s\n", Third_Head.name));
  37.   ACE_Message_Block *mblk_2 = mblk->clone();
  38.   mblk_2->duplicate(mblk);
  39.   ACE_DEBUG((LM_DEBUG, "Message Block Cloned Size = %d\n", mblk_2->size()));
  40.   mblk_2->reset();
  41.   mblk->cont(mblk_2);
  42.   
  43.   mblk->rd_ptr(sizeof (Head) * 3);
  44.   Head Fourth_Head;
  45.   ACE_OS::memcpy(&Fourth_Head, mblk->rd_ptr(), sizeof (Head));
  46.   ACE_DEBUG((LM_DEBUG, "Third_Head Infomation: name - %s\n", Fourth_Head.name));
  47.   mblk->release();
  48.   mblk = 0;
  49.   mblk_2->release();
  50.   mblk_2 = 0;
  51.   
  52.    
  53.   return 0;
  54. }
复制代码

运行结果:
Message Block Size = 104
Message Block Size = 26
Second_Head Infomation: name - Lien.C
Third_Head Infomation: name - 中华人民共和国
Message Block Cloned Size = 104
Third_Head Infomation: name - œß@(乱码)
Illegal instruction (不知道为什么会输出这个, 可能地址越界)

在做mblk->cont以后发现信息似乎没有被写进来. 请问是在mblk->clone()的时候出了问题, 还是我的读指针rd_ptr不对呢?
 楼主| 发表于 2008-1-15 21:57:23 | 显示全部楼层
似乎解决了呢.

将mblk->cont(mblk_2)改成:

mblk->wr_ptr ( mblk->size() );

mblk->size ( mblk->size() + mblk_2->size() );

mblk_2->reset();

mblk->copy ( mblk_2->rd_ptr(), mblk_2->size() );

在ace的例子Logging_Handler.cpp中对ACE_Message_Block的数据块连接处理似乎简洁, 不知道为什么我的不太好用,只好用这个笨一点的办法了. 希望有人指点直接连接多个ACE_Message_Block块的方法.

注: mblk->clone()是深拷贝, mblk->duplicate()是浅拷贝

     mblk->copy()会将写指针wr_ptr向后移动新拷贝数据块大小

     mblk->reset()会根据align方式移动到原点(默认原点是数据块头)

     还有一个ACE_Message_Queue似乎是用来管理以ACE_Message_Block块为数据结点的链表, 正在研究怎么用.
 楼主| 发表于 2008-1-15 21:57:29 | 显示全部楼层
C++网络编程卷1里面有详细的解释。
你对这个类的认识不清,所以上面的code有很多问题,看着都累人呐。加油。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 14:40 , Processed in 0.028769 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表