zoukankan      html  css  js  c++  java
  • 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)

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

  • 相关阅读:
    关于区间数颜色的主席树解决
    1020考试总结
    QR算法
    新的征程
    端点星2020.12.2联赛
    自我介绍&友链
    3个搜索
    搜索格式这样写
    T107073 归并排序
    还有这个题
  • 原文地址:https://www.cnblogs.com/jianc/p/2881651.html
Copyright © 2011-2022 走看看