Qt基於TCP網絡程序發包封包抽象


之前沒經驗, 發送數據包的時候, 包頭包尾等信息都是通過重新定義一個結構體實現, 不同的協議包就有不同的結構體, 結果導致這樣的現象: 有多少上層業務協議包, 我就分別重新定義一個對應的加上包頭包尾的新的結構體, 很費勁.......額....

現在, 重新想了下, 一個改進的方式, 把"封包"過程抽象出來, 使用Qt的QByteArray來操作流數據(還是挺方便的)

.h

#ifndef PACKET_H
#define PACKET_H

#include <QObject>
#include <QByteArray>

#define FrontPacket     "KT"
#define EndPacket       "END"

//把數據封包, 加上包頭包尾包長標志校驗
class Packet : public QObject
{
    Q_OBJECT
public:
    explicit Packet(QObject *parent = 0);
    
    static QByteArray Pack(QByteArray data);   //封包
};

#endif // PACKET_H

.cpp

#include "packet.h"


Packet::Packet(QObject *parent) :
    QObject(parent)
{
}

QByteArray Packet::Pack(QByteArray data)
{
    QByteArray pack;
    pack.append(FrontPacket);
    quint32 len = 4 + data.size() + 4 + 3;
    pack.append(reinterpret_cast<const char*>(&len), 4);
    quint32 flag = 0;
    pack.append(reinterpret_cast<const char*>(&flag), 4);
    pack.append(data);
    quint32 crc = 0;
    pack.append(reinterpret_cast<const char*>(&crc), 4);
    pack.append(EndPacket);
    return pack;
}

 

然后, 在上層界面操作時候, 可以用定義好的上層協議結構體對象直接轉成字節流QByteArray類型然后發往底層網絡的發送數據接口, 在底層發送數據接口中, send數據前, 先把傳進來的協議數據包傳到上邊封裝好的靜態類成員Pack()中處理一下, 就可以把返回值直接send了

 

好處: 上層業務, 只要封裝好上層協議數據, 就可以調用網絡底層一個統一的發送數據接口進行發包(本挫人之前這樣做:底層網絡提供了針對不同協議包有不同的接口方法, 然后每添加一條新協議, 就要添加一個成員函數, 每刪刪除一條協議, 就要.....111111111111111111)

 

完.....................................................

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM