zoukankan      html  css  js  c++  java
  • 如何写一个通用的网络包?

    namespace packet {
    /*!
    |magic|type|length|data|checksum|
    |4	  |4   |4     |    |2       |
    */
    #pragma pack(push)
    #pragma pack(1)
    
    class IPacket
    {
    public:
    	virtual ~IPacket() = default;
    protected:
    	virtual QByteArray sendData(const QByteArray &data) = 0;
    	virtual IPacket &receiveData(const QByteArray &data) = 0;
    	virtual quint32 type() const = 0;
    	virtual bool isVaild() = 0;
    	virtual bool isEqual(quint32 type) = 0;
    };
    
    constexpr quint32 magic = (quint32)0x49506B74;//IPkt asscii
    
    class Packet : public IPacket
    {
    public:
    	enum Type:quint32 {
    		UserType = 1
    	};
    	QByteArray sendData(const QByteArray &data) override {
    		QByteArray byte;
    		QDataStream out(&byte, QIODevice::WriteOnly);
    		out << magic;
    		out << this->type();
    		out << (quint32)data.length();
    		out.writeRawData(data.data(), data.size());
    		out << qChecksum(data.data(), data.length());
    		return byte;
    	}
    	Packet &receiveData(const QByteArray &data) override {
    		QDataStream in(data);
    		in >> m_magic;
    		in >> m_type;
    		in >> m_length;
    		m_raw.resize(m_length);
    		in.readRawData(m_raw.data(),m_length);
    		in >> m_checksum;
    		return *this;
    	}
    	quint32 type() const override {
    		return UserType;
    	}
    	bool isVaild() override {
    		return m_checksum == qChecksum(m_raw.data(), m_raw.length()) ? true : false;
    	}
    	bool isEqual(quint32 type) override {
    		return type == m_type ? true : false;
    	}
    	quint32 m_magic;
    	quint32 m_type;
    	quint32 m_length;
    	QByteArray m_raw;
    	quint16 m_checksum;
    };
    
    struct alignas(alignof(quint32)) PacketHeader
    {
    	void sequence(const QByteArray &data) {
    		QDataStream in(data);
    		in >> m_magic;
    		in >> m_type;
    		in >> m_length;
    	}
    	bool isValid() {
    		return (magic == magic && m_type > 0 && m_length > 0) ? true : false;
    	}
    	quint32 m_magic{ 0 };
    	quint32 m_type{ 0 };
    	quint32 m_length{ 0 };
    };
    
    #pragma pack(pop)
    }
    
    转载请注明出处并保持作品的完整性,谢谢
  • 相关阅读:
    day10函数名称空间与作用域(3)
    day10函数参数使用(2)
    day10函数基础(1)
    文件处理
    vue打包时semver.js版本报错
    js修改日期
    vue click事件获取当前元素属性
    js截取关键字之后的字符串
    css 清除浮动
    纯CSS绘制三角形
  • 原文地址:https://www.cnblogs.com/cheungxiongwei/p/14360810.html
Copyright © 2011-2022 走看看