ni0in 发表于 2011-9-27 15:07:26

ACE_CDR通信的问题

各位大哥,小弟有个问题比较挠头,传递一个结构体,请教各位:
结构体;
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;
          iov1.iov_base = out.begin()->rd_ptr();
          iov1.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 吗?

winston 发表于 2011-9-28 09:28:07

我的印象中,CDR按8字节对齐,你的数据结构要自己仔细检查一下,在接收端看看是否有对齐问题。不建议直接按结构发送,因为不同系统间可能会导致兼容性问题。

winston 发表于 2011-9-28 09:28:09

我的印象中,CDR按8字节对齐,你的数据结构要自己仔细检查一下,在接收端看看是否有对齐问题。不建议直接按结构发送,因为不同系统间可能会导致兼容性问题。

ni0in 发表于 2011-9-28 11:05:34

收到,对齐的问题,我修改了,在config.h的里面写的。
#include "ace/config-win32.h"
#define ACE_ENABLE_SWAP_ON_WRITE
#define ACE_LACKS_CDR_ALIGNMENT
#define ACE_CDR_IGNORE_ALIGNMENT

另外不发送数据结构,那么发送什么内容做数据传递呢,一般大家都怎么做,多谢。。。

ni0in 发表于 2011-9-28 11:05:58

收到,对齐的问题,我修改了,在config.h的里面写的。
#include "ace/config-win32.h"
#define ACE_ENABLE_SWAP_ON_WRITE
#define ACE_LACKS_CDR_ALIGNMENT
#define ACE_CDR_IGNORE_ALIGNMENT
另外不发送数据结构,那么发送什么内容做数据传递呢,一般大家都怎么做,多谢。。。

winston 发表于 2011-9-28 13:27:32

我习惯上自己定义一下协议规则,对端解析。又习惯用文本方式传输。

ni0in 发表于 2011-9-28 14:17:58

多谢,我刚才试了一下,还是不行。重新定义一个ACE_Message_Block和ACE_InputCDR 接受list中的字符串就可以了。
如:
ACE_Message_Block *payload1 =new ACE_Message_Block (ACE_DEFAULT_CDR_BUFSIZE);
                if( m_LoggingPeer.recv_n( payload1->wr_ptr(), ilength, 0,0,&bytes_transferred) >0 )
                {
                        payload1->wr_ptr ( ilength );
                        ACE_InputCDR cdr1 (payload1);
                        for ( int i = 0; i< 3; i++ )
                        {
                                cdr>>str6;
                                string temp = str6.c_str();
                                listdata.push_back( temp );
                        }
                }
请大哥帮忙看看,是处理CDR和block之间的关系没处理好嘛?
问题2:
嗯,我其实也是跟你想的差不多,我就像把文本的功能用不同的文本表示出来。整体传的其实就是一个文本。
页: [1]
查看完整版本: ACE_CDR通信的问题