整(解)编

来源:互联网 发布:淘宝河北邢台羊绒衫 编辑:程序博客网 时间:2024/06/05 08:44

ACE整编和解编使用总结

在做网络通信时,由于不同硬件和操作系统之间的差异,是跨平台通信需要处理比较复杂的字节序,以字节对齐的问题。这些问题手工处理起来比较复杂,而且容易出错。
使用ACE提供的整编和解编类:ACE_OutputCDR和ACE_InputCDR可以很好处理平台差异带来的问题。现在总结如下:
一:发送端
1.创建流,指定流中数据的长度
ACE_OutputCDR payload (max_payload_size);
2.向流中插入需要发送到内容:
payload << log_record;
其中操作符:<<是经过重载的:
int operator<< (ACE_OutputCDR &cdr, const ACE_Log_Record &log_record)
{
 // 发送到内容的长度

 size_t msglen = log_record.msg_data_len ();
 ACE_Log_Record &nonconst_record = (const_cast<ACE_Log_Record&> (log_record));
 // 把发送的结构中的每个内容依次插入到流中,在解编的时候,依次读出。
 cdr << ACE_CDR::Long (log_record.type ());
 cdr << ACE_CDR::Long (log_record.pid ());
 cdr << ACE_CDR::Long (log_record.time_stamp ().sec ());
 cdr << ACE_CDR::Long (log_record.time_stamp ().usec ());
 cdr << ACE_CDR::ULong (msglen);
 cdr.write_char_array (nonconst_record.msg_data (), msglen);
 return cdr.good_bit ();
}
3.通过payload.begin ()->rd_ptr ()指定要发送的消息链的首个消息块的地址。
二:接收端
1.总结解编的使用方法。
消息头部信息是接下来的消息内容的长度和字节序。接收到消息后,按照整编的顺序,把消息的各个部分依次解编出来。
我理解整编和解编就是一个消息流,可把任何类型的数据插入到流中,在接收到时候,只要按照插入时代顺序依次把流中的数据提取出来就可以了。由于整编解编解决的问题是字节序和字节对齐的问题,所以,在整编时要指定发送方的字节序,并在解收的时候,先提取出字节序内容,再把解编流按提取出的字节序设置。在解编之前,需要把解编流设置字节对齐,按8字节对齐。
// 按整编顺序解编出数据。
int operator>> (ACE_InputCDR &cdr, ACE_Log_Record &log_record)
{
 ACE_CDR::Long type;
 ACE_CDR::Long pid;
 ACE_CDR::Long sec, usec;
 ACE_CDR::ULong buffer_len;


 // Extract each field from input CDR stream into <log_record>.
 if ((cdr >> type) && (cdr >> pid) && (cdr >> sec) && (cdr >> usec)&& (cdr >> buffer_len))
 {
   ACE_TCHAR log_msg[ACE_Log_Record::MAXLOGMSGLEN+1];
   log_record.type (type);
   log_record.pid (pid);
   log_record.time_stamp (ACE_Time_Value (sec, usec));
   cdr.read_char_array (log_msg, buffer_len);
   log_msg[buffer_len] = '\0';
   log_record.msg_data (log_msg);
 }
 return cdr.good_bit ();
}
设置字节对齐
// 按8字节对齐
ACE_CDR::mb_align (payload);

原创粉丝点击