- TCP通信需要自定义消息体,本博文是构建了一个QT下的消息类。
.h
// 消息结构体,消息头为20个字节
typedef struct
{
unsigned int send_id; // 发送方的ID(网络的IP、SRIO的ID)
unsigned int recv_id; // 接收方的ID(网络的IP、SRIO的ID)
unsigned int msg_type : 8; // 消息类型
unsigned int len : 24; // 消息长度,字节数
unsigned int conn_type: 8; // 连接类型,TCP、UDP等
unsigned int pkg_num : 8; // 总的包数(用于组包传输)
unsigned int pkg_idx : 8; // 子包索引(用于组包传输),从1计数
unsigned int rsvd : 8; // 保留位
unsigned int check_sum; // 校验位
} DispCtrlMsg;
#ifndef MESSAG_H
#define MESSAG_H
#include "msg_type.h"
#include <QByteArray>
#include <iostream>
class Messag
{
private:
DispCtrlMsg *msgHead;
QByteArray *msgBody;
public:
explicit Messag();
~Messag();
void saveMsgHead(const DispCtrlMsg &head);
void saveMsgBody(const QByteArray &body);
const DispCtrlMsg& getMsgHead(void);
const QByteArray& getMsgBody(void);
Messag &operator=(Messag *pre);
};
#endif // MESSAG_H
.c
#include "messag.h"
Messag::Messag()
{
msgHead = new DispCtrlMsg();
msgBody = new QByteArray();
}
Messag::~Messag()
{
delete msgHead;
delete msgBody;
}
void Messag::saveMsgHead(const DispCtrlMsg &head)
{
msgHead->check_sum = head.check_sum;
msgHead->conn_type = head.conn_type;
msgHead->len = head.len;
msgHead->load = head.load;
msgHead->msg_type = head.msg_type;
msgHead->pkg_idx = head.pkg_idx;
msgHead->pkg_num = head.pkg_num;
msgHead->recv_id = head.recv_id;
msgHead->rsvd = head.rsvd;
msgHead->send_id = head.send_id;
}
void Messag::saveMsgBody(const QByteArray &body)
{
*msgBody = body;
}
const DispCtrlMsg& Messag::getMsgHead(void)
{
return *msgHead;
}
const QByteArray& Messag::getMsgBody(void)
{
return *msgBody;
}
Messag &Messag::operator=(Messag *pre)
{
this->saveMsgHead(pre->getMsgHead());
this->saveMsgBody(pre->getMsgBody());
}
- 运算符重载:赋值运算符重载,返回Message的引用,使用关键字 operator,使用智能指针,this.