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)

 

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

 

你可能感兴趣的:(tcp)