QT通过TCP协议发送结构体数据

这篇具有很好参考价值的文章主要介绍了QT通过TCP协议发送结构体数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

做上位机的时候下发数据,数据是一个结构体,这里就阐述一下怎么通过TCP协议发送结构体。
我自己写的时候主要通过两种方式,一种是memcpy,另一种是用QDataStream。


先在mainwindow.h头文件中定义结构体:

    struct EDWINWZY
    {
        char name='A';
        int age=1;

    }edwinwzy;

1. memcpy方式

1.1 发送整个结构体

函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中

     //定义bit流
     QByteArray transfer;

     //使用memcpy之前要分配内存空间
     transfer.resize(sizeof(struct EDWINWZY));
     //data.resize(sizeof(edwinwzy));//写法和上面一句效果一样

     //内存拷贝
     memcpy(transfer.data(),&edwinwzy,sizeof(edwinwzy));

     //发送比特流数据
     tcpSocket->write(transfer);

这种方式似乎就定死了只能发送结构体大小的数据,但其实不然,我可以通过QByteArray类的成员函数append来添加一个乃至多个字节的数据。
下面的append函数中备选的参数类型名就说明了很多,我可以添加单个字符,也可以添加n个同一个字符,也可以添加另外一个QByteArray的数据,即一串比特流数据,亦可以添加QString类型的数据。
QT通过TCP协议发送结构体数据,Qt学习笔记,qt,tcp/ip,开发语言

1.2 发送部分数据

那这是在发送完一整个结构体之后再添加数据,如果我想单独一个一个发结构体的变量呢?
那其实直接用append就可以了。

    //定义bit流
    QByteArray transfer;

    transfer.append(edwinwzy.name);
    transfer.append(edwinwzy.age);

    transfer.append('\n');
    //发送比特流数据
    tcpSocket->write(transfer);

有个要注意的是,有时候我最后不加换行符,接收端可能会出现无法显示的情况。这个我只在书中TCPClient项目中出现过,我用串口转网口来接收网口的数据,在串口端接收到的数据都是正常的。

2. QDataStream

这个就类似于C++ 的std::cout了。
不过发送的数据有两种情况。

2.1 符号<<

第一种情况是直接用<<符号进行发送,这种发送会额外发送几个字节数据用来表示我发送的数据所占的字节数。


	QByteArray tranferdata;
 	//后面这个QIODevice什么的也可以不选择添加。
    QDataStream out(&tranferdata,QIODevice::WriteOnly|QIODevice::Append);
	char A=a,B=b,C=c,D=d;
	out<<A<<B<<C<<D;
	tcpSocket->write(transfer);

实际上我们收到的字节数据用应该是 04 61 62 63 64,而我们其实只要后面的四个abcd的ascii码数据,那这个方法就有点问题了。

2.2 wrieteRawData

下面这个写原始数据的writeRawData函数就解决了问题

如果我们要发送其他类型数据(不是char类型),那我们使用这个函数的时候最好做一个强制类型转换。


	QByteArray tranferdata;
 	//后面这个QIODevice什么的也可以不选择添加。
    QDataStream out(&tranferdata,QIODevice::WriteOnly|QIODevice::Append);
    int A=91,B=92;
    out.writeRawData((char*)&A,sizeof(A));
    out.writeRawData((char*)&B,sizeof(B));
	tcpSocket->write(transfer);

这种写法就解决了多发送字节的问题,只不过因为这里AB是以int举例,所以它们分别占4字节。
收到的数据就应该为 00 00 00 61 00 00 00 62

总结

这篇博客主要针对TCP发送结构体数据遇到的问题进行了归纳,发单个以及发部分情况都可以实现。文章来源地址https://www.toymoban.com/news/detail-601906.html

到了这里,关于QT通过TCP协议发送结构体数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ Qt TCP协议,处理粘包、拆包问题,加上数据头来处理

    目录 前言: 场景: 原因: 解决: 方案2具体细节: 纯C++服务端处理如下: Qt客户端处理如下:         tcp协议里面,除了心跳检测是关于长连接操作的处理,这个在前一篇已经提到过了,这一篇将会对tcp本身的一个问题,进行处理:那就是做网络通信大概率会遇到的问题

    2024年02月04日
    浏览(52)
  • QT基于TCP协议实现数据传输以及波形绘制——安卓APP及Windows程序双版本

    文章代码有非常非常之详细的解析!!!诸位可放心食用 这个玩意我做了两个,一个是安卓app,一个是Windows程序。代码并非全部都是由我从无到有实现,只是实现了我想要的功能。多亏了巨人的肩膀,开源万岁!!! 我把程序放到GitHub上,需要的可自取。 安卓app:   mai

    2024年02月15日
    浏览(46)
  • 【Qt网络编程】实现TCP协议通信

    传输控制协议(TCP,Transmission Control Protocol)是 一种面向连接的、可靠的、基于字节流的传输层通信协议 ,由IETF的RFC 793 定义。 TCP建立连接前,需要进行三次握手,如下图所示: TCP断开连接前,需要进行四次挥手,如下图所示: Qt中提供了QTcpSocket类和QTcpServer类分别用于创

    2024年02月16日
    浏览(46)
  • C#向指定的ip地址通过TCP/IP协议发送和接受信息

    需要使用Socket类来创建和连接TCP/IP套接字,并使用Send和Receive方法来发送和接收数据。还需要引用System.Net和System.Net.Sockets命名空间。 以下是一个示例代码,它发送一个字符串消息到指定的IP地址和端口,并接收返回消息。 了解更多C#可以访问C#的官方教程 本文也参考了C#的官

    2024年02月07日
    浏览(44)
  • QT-通过tcp传输文件和文本消息

    在建立连接的基础上增加了发送文件的功能,在接收端和发送端定义了一个枚举类型,用于判别发送的是文件还是文本消息 客户端ui 1.获取端口号和ip地址,进行连接,再次点击即可断开连接 2.点击发送消息按钮,获取文本框内容,将消息发送出去,其中type为文本消息类型

    2024年02月03日
    浏览(36)
  • QT中发送结构体占用字节相关问题

    最近通过上位机发送数据的时候,针对收到的数据突然多出几个bit产生了疑问。用sizeof来看占据的字节大小,发现和实际应该发送的不对。后面查阅了相关资料,理解了这一部分原因,这里做一个记录。 错误想法: 结构体大小8+2+2=12个字节 原因: 计算结构体大小时需要考虑

    2024年02月15日
    浏览(40)
  • Qt5学习笔记:Qt两个窗口(Widget)间传递数据

    0x01 原理介绍 Qt两个窗口之间传递数据实际上还是利用了信号与槽的概念来实现。 本质上讲,我们只需要实现A窗口发射信号,B窗口槽函数响应信号即可。 首先我们在A窗口的头文件中定义发射的信号: 然后在B窗口的头文件中定义槽函数: 最后我们需要将信号与槽连接起来,

    2024年02月13日
    浏览(43)
  • QT学习笔记-开发环境编译Qt MySql数据库驱动与交叉编译Qt MySql数据库驱动

    如果需要在QT程序中实现与MySQL数据库的交互,那么必不可少的一环就是对Qt MySql数据库驱动的编译。 操作系统:Windows10 专业版 64位 Qt版本:Qt 5.15.2 开发环境Qt安装路径:D:Qt 交叉编译服务器:Ubuntu 18.4 交叉编译服务器Qt安装路径:/opt/Qt 目标芯片:rk3568 目标平台:arm64 Qt安装

    2024年02月11日
    浏览(75)
  • 基于TCP/IP协议的网络摄像头的QT项目

    目录 项目简述: 1.服务器  步骤一:首先搭建一个基本的服务器框架。  1.初始化服务器的函数主体  2.等待连接 步骤二:数据库的使用,本次项目使用的Sqlite3数据库 1.数据库初始化 2.登录时使用数据库  3.注册时使用数据库 步骤三:摄像头的调用与数据传输 1.V4L2框架的使

    2024年02月03日
    浏览(37)
  • QTday4(鼠标事件和键盘事件/QT实现连接TCP协议)

    笔记 时钟绘制  

    2024年02月15日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包