QTはSocketメッセージクラスをカスタマイズし、演算子のオーバーロードを実行します

  • 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());
}
  • 演算子のオーバーロード:代入演算子のオーバーロード、メッセージへの参照の返却、キーワード演算子の使用、スマートポインターの使用。

おすすめ

転載: blog.csdn.net/u013894391/article/details/100588149