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);