在 qt 中使用 TCP IP 发送结构

Posted

技术标签:

【中文标题】在 qt 中使用 TCP IP 发送结构【英文标题】:To send structure using TCP IP in qt 【发布时间】:2016-07-05 12:23:50 【问题描述】:

我有以下代码。我希望,但我无法做到。请帮我发送结构。

struct message

    U8 messagedata;
    U32 date;
msg;

msg.messagedata = 30;

msg.date = 27;

然后使用 write(msg, len(msg)) 函数发送。但是如何把这个结构放在这个写函数中。我正在为 TCP/IP 使用内置的 Qt 网络库。

【问题讨论】:

【参考方案1】:

要在 Qt 中使用 TCP,您可以使用 QTcpSocket 和 QTcpServer 类。 QTcpSocket 继承 QIODevice 类,该类有 write 方法可以根据需要将数据写入套接字。

为了给你发送结构,你可以打包你的结构:

#pragma pack(push, 1)
struct message

    quint8  messagedata;
    quint32 date;
msg;
#pragma pack(pop)

然后使用 write 方法,像这样:

socket->write(reinterpret_cast<char*>(yourMessage), sizeof(msg));

另一种方式,你可以实现QDataStream的运算符:

QDataStream &operator<<(QDataStream &stream, const msg &m)

  stream << m.messagedata;
  stream << m.date;

并像这样使用它:

QDataStream stream(socket);
stream << yourMessage;

【讨论】:

我必须在你的消息变量中添加什么? 你可以把你的数据放在yourMessage中。例如:msg yourMessage; yourMessage.messagedata = 30; yourMessage.date = 27; (如您所愿)【参考方案2】:

试试:

QByteArray ba;
ba << msg.messagedata << msg.date;
socket.write (ba);

这只是向客户端发送QByteArray,您也需要发送大小(实现一个简单的协议)。

【讨论】:

以上是关于在 qt 中使用 TCP IP 发送结构的主要内容,如果未能解决你的问题,请参考以下文章

数据在网络中的发送和接收过程--简略版(TCP/IP五层结构)

浅看网络结构与TCP/IP协议栈

qt中用tcp发送Qtablewidget中的数据

3.4 TCP/IP体系结构各层协议

TCP/IP体系结构

TCP/IP协议详解