c++ - 使用UDP协议(protocol)从Windows Socket发送到Qt Socket的网络包编解码结构

标签 c++ qt

如何对从c++套接字发送到qt udp套接字的结构进行序列化和反序列化

实际上我正在尝试这个序列化和反序列化的逻辑 像这样

struct stCardInfo
{
    unsigned short nsCardType;
    unsigned short nsNoOfSignals;
    unsigned short nsStatus;
};

struct stErrorInfo
{
    unsigned short nsErrorType;
    char ErrorInfo[8];
};
struct stInitHealthCheck
{
    unsigned short nsNoOfCards;
    stCardInfo* lsCardInfo;
};

   stInitHealthCheck stHealthCheck;

   unsigned short *q = (unsigned short *)data;

   stHealthCheck.nsNoOfCards = *q;       q++;

   stHealthCheck.lsCardInfo = new stCardInfo;
   stHealthCheck.lsCardInfo->nsCardType = *q;   q++;
   stHealthCheck.lsCardInfo->nsNoOfSignals = *q;     q++;
   stHealthCheck.lsCardInfo->nsStatus= *q;     q++;

但是如果结构更多,那么我每次解码到特定数据类型都会变得复杂且耗时 所以我问是否有任何有效的序列化和反序列化方法,以便我可以非常快速地解码和编码发送和接收的 udp 数据包

最佳答案

通信设备上的字节顺序可能不同,您应该使用 htonsntohs发送/接收时 unsigned short

此外,如果您将结构转换为 char*发送方的缓冲区,请注意,这不是编写通信协议(protocol)的跨平台方式。当您的代码为 compiled using a different compiler 时,该结构在二进制级别可能具有不同的表示形式.

但是当你有很多 serialization libraries that are already available 时,为什么还要搞砸所有这些低级的东西呢? .只需从列表中选择一个即可!

如果双方都使用Qt,可以使用 QDataStream .你可以看看Qt算命client/server用于演示。

如果其中一个不使用 Qt,您可能想使用 JSON(supported in Qt,还有 many JSON C++ libraries)。如果您更喜欢二进制格式,您可能想看看 msgpack .

关于c++ - 使用UDP协议(protocol)从Windows Socket发送到Qt Socket的网络包编解码结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48337723/

相关文章:

c++ - 在取消线程上使用 QFuture 释放内存

c++ - 存储有关 View 中项目的持久信息

c++ - 理论或方向、c++、qt 和使用 MXE 进行交叉编译

python - 使用来自 C++、PyObject 的参数创建 Python 构造函数

c++ - 命名空间别名范围问题

qt - 如何在 QT 设计器中更改 QButtonGroup 的名称?

c++ - 使用 ifstream while 循环,如何显示输入错误并在下一行继续?

c++ - OpenGL 渲染到 OpenCV 垫作为纹理并在 OpenCV 中重用它

Qpushbutton 悬停/按下图标

c++ - 计时器无法与 wiringPiISR(QtQuick 应用程序)一起使用