您的位置:首页 > 编程语言 > PHP开发

ACE_OutputCDR,ACE_InputCDR,ACE_Message_Block使用2

2016-01-01 12:00 651 查看
一  利用ACE_OutputCDR,ACE_Message_Block发送数据和注意事项

int clientEventHandler::SendData(const char * szMsg)

{

     ACE_ASSERT(szMsg);

 ACE_Message_Block * mb = NULL;

 ACE_OutputCDR cdr(ACE_CDR::MAX_ALIGNMENT+8);

 mb = new ACE_Message_Block(cdr.begin()->rd_ptr(),cdr.begin()->total_length());

 ACE_ASSERT(mb);

/* mb = new ACE_Message_Block();

 

 ACE_OutputCDR cdr(mb->wr_ptr(),ACE_CDR::MAX_ALIGNMENT+8); *///这种写法测试过是不行的。
 size_t length1 = cdr.length();       //获取cdr长度;

 cdr << ACE_CDR::Char('E');

 cdr << ACE_CDR::Long(ACE_OS::strlen(szMsg) + 5) ;  // 加上5,因为在使用  cdr << szMsg时,ace 会自己加上4个字节的字符串长度和一个字符串休止符。
 size_t length2 = cdr.length();      //获取发送字符'E',ACE_OS::strlen(szMsg) + 5 后cdr的长度。

 mb->wr_ptr(length2 - length1);      //总共使用的空间,以字节为单位;

 

 cdr << szMsg;          //插入符 << 发送字符串,包括字符串长度和字符串休止符。

 size_t length3 = cdr.length();

 

 mb->wr_ptr(length3 - length2 /*ACE_OS::strlen(szMsg) + 5*/);

 size_t nSend =  sock_.send_n(mb);                 

 

 mb->release();

 return nSend;

     
}
二  利用 ACE_InputCDR ,ACE_Message_Block 接受数据和注意事项

int clientService::handle_input(ACE_HANDLE h)

{

 ACE_Message_Block * mb = new ACE_Message_Block (ACE_DEFAULT_CDR_BUFSIZE);

 if(sock_.recv_n(mb->wr_ptr(),8) == 8)

 {

  mb->wr_ptr(8);    //写指针往前移8个字节
  ACE_InputCDR cdr(mb); //用 已经更新过 wr_ptr 的 mb 初始化 cdr
  ACE_CDR::Char Type;

  ACE_CDR::Long Msglength;

  cdr >> Type;          //读取表达式类型;
  cdr >> Msglength;     //读取总长度=   4 + 1 + 字符串长度;
  mb->release();
  ACE_Message_Block * payload = new ACE_Message_Block (ACE_DEFAULT_CDR_BUFSIZE);

  

  int n = sock_.recv_n(payload->wr_ptr(),Msglength);

  if(n /*sock_.recv_n(payload->wr_ptr(),Msglength) */> 0)

  {

   mb->wr_ptr(n); //mb 的 wr_ptr 一定要先更新;
   ACE_InputCDR payloadcdr(mb);//然后初始化ACE_InputCDR

   char * pResult = NULL;

   payloadcdr >> pResult; //提取符 >> 获取pResult

   CCalculate calcul;

   calcul.HandleData(pResult);

   pResult = calcul.GetCaculResult();

  }
 }

 return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息