ACE_OutputCDR,ACE_InputCDR,ACE_Message_Block使用2

一  利用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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章