找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5330|回复: 2

ACE_CDR通信的问题

[复制链接]
发表于 2011-9-27 15:03:47 | 显示全部楼层 |阅读模式
各位大哥,小弟有个问题比较挠头,传递一个结构体,请教各位:
结构体;
struct MSG_C2S
{
        string                        str_1MsgID;
        string                        str_2Moid;
        string                        str_3MsgIndex;
        string                        str_4Ret;
        string           str_5Count;
        list<string>  list_6data;
};
客户端:
ACE_Message_Block *mb =
                  new ACE_Message_Block (ACE_DEFAULT_CDR_BUFSIZE);
          ACE_OutputCDR out( mb );
          MSG_C2S msg1;
          /*3*/
          msg1.str_1MsgID = "00000001";
          msg1.str_2Moid   = "00000002";
          msg1.str_3MsgIndex = "00000003";
          msg1.str_4Ret = "00000004";
          msg1.str_5Count = "00000003";
          msg1.list_6data.push_back( "00000015");
          msg1.list_6data.push_back( "00000016");
          msg1.list_6data.push_back( "00000017");

          out << ACE_CString( msg1.str_1MsgID.c_str() );
          out << ACE_CString( msg1.str_2Moid.c_str() );
          out << ACE_CString( msg1.str_3MsgIndex.c_str() );
          out << ACE_CString( msg1.str_4Ret.c_str() );
          out << ACE_CString( msg1.str_5Count.c_str() );
          list<string>::iterator itor = msg1.list_6data.begin();
          for ( ; itor != msg1.list_6data.end(); itor ++ )
          {
                out << ACE_CString( (*itor).c_str());
          }
  iovec iov1[1];
          iov1[0].iov_base = out.begin()->rd_ptr();
          iov1[0].iov_len  = out.length();
          return logging_peer_.sendv_n (iov1, 1);
服务器:
        ACE_Message_Block *payload =new ACE_Message_Block (ACE_DEFAULT_CDR_BUFSIZE);
        if ( m_LoggingPeer.recv_n( payload->wr_ptr(),65 ) == 65 )
        {
                payload->wr_ptr ( 65 );
                // Create a CDR stream to parse the 8-byte header.
                ACE_InputCDR cdr (payload);
                ACE_CString str1,str2,str3,str4,str5;

                cdr >> str1;
                cdr>> str2;
                cdr>> str3;
                cdr>> str4;
                cdr>> str5;
                //以上数据均正常。。。
                int ilength = 39;
                payload->size( 65 + 39 + ACE_CDR::MAX_ALIGNMENT );
                //ACE_CDR::grow(payload, 65 + 39  );
                //ACE_CDR::grow (payload, 8 + ACE_CDR::MAX_ALIGNMENT + ilength);
                list<string>  listdata;
                ACE_CString str6;
                if( m_LoggingPeer.recv_n( payload->wr_ptr(), 39 ) == 39 )
                {
                        payload->wr_ptr ( 39 );
                        for ( int i = 0; i< 3; i++ )
                        {
                                cdr>>str6;//此处无法接受到正常的数据是为啥。
                                string temp = str6.c_str();
                                listdata.push_back( temp );
                        }
                }
                /*
                ACE_CDR::Char c;
                ACE_CDR::UShort s;
                cdr >> c;
                cdr >> s;*/
        }

问题1:str1~str5接受正常,为什么str6接受不正常?如果一次性接受65+39个字节就正常了,为什么分步骤接受不行呢?
问题2:能直接ACE_Message_Block 发送而不使用iovec 吗?

谢谢各位了。
发表于 2011-9-27 20:01:16 | 显示全部楼层
问题1:客户端打包list_6data时,先打包其元素个数,再打包具体的各个具体元素。服务端在解包时,先解出有多少个元素,再做一个循环,依次解出各个元素值并加入到list_6data中。
问题2:可以的。ACE_Message_Block* mb;...peer().send(mb->rd_ptr(), mb->length(); mb->release();
 楼主| 发表于 2011-9-28 11:16:45 | 显示全部楼层
多谢您的回复:
问题1:我已经打包个数了,就是这个 msg1.str_5Count,下面我是为了简单写死做的,循环3次。
问题2:嗯,我试验过了,不过我的mb.rd->ptr()中没问题,mb->length 为0,比较怪异,写死常数39也能发出去。郁闷了。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-22 17:21 , Processed in 0.014874 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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