欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用QT时有关TCPScoket收发数据包,数据错误问题

程序员文章站 2022-07-13 23:35:28
...
	前提说明:QT是在windows下的,服务器是linux下的

问题1:这次项目是用QT收数据,我从Llinux服务器发图片包过来,采用分片传输的方法。然后QT这边是用TCPsocket接收,发一个包就接受一次,然后写入文件中保存,直到最后一个包过来关闭文件,就能完成一张图片的传输。然后做的时候是,一开始测试每次发过来的图片数据1024个字节,采用crc校验。全程没啥问题,然后就觉得传输的太慢了,想要传2048个字节。这次就传了5个包,第5个包的包头没有错,但是crc校验包体也就是图片数据是错的校验失败了,第6个包开始就是连包头的数据全部都错乱,读出来的数据变成一个很大的随机数。一开始我以为是我代码问题,我就去查,查了很久,感觉代码没啥问题,毕竟传1024时候都没事。我就去查资料,我发现,QT他这个东西,你一次传输的数据越大,他满包的概率就越小,比如你传4000字节,他可能一次收2500,然后再收一次1500都不一定。所以当你再接收函数那边写每次接收那么大的字节,可能他这次接收的根本就没那么多字节。这时候因为你操作你读取的东西,就很有可能出现段错误,导致程序奔溃。
问题2:当我传输小字节的时候,但是又感觉传输的太慢了,传个图片半天,这时候我就把服务器哪里的代码改成10ms发一次数据,本来是50ms发一次。然后发现又丢包了,少了20多个包。这个丢的数量不一定。又去查,发现是QT的信号的槽机制的问题,当你的QTCPsocket接收到读取信号的时候,你的槽反应不过来了,就会出现比如:第一个包过来,你的槽处理中,这时候第2个信号过来了,因为太快了,你的槽没反应过来,然后第3个信号又来了,这时候槽处理了第 3个信号的数据,相当于你丢了第2个包的数据。
解决办法:不要来一次数据读一次数据,而是等图片数据都传送到,TCP接收缓冲区的时候,这个时候你的接收端再去一次一次接收,就不会有问题。这个办法可以同时解决,丢包和数据错误问题。

	第一次写,最主要的还是记录一下碰到的问题,免得自己以后忘了。小白,如果有什么错的地方欢迎指正。谢谢。
相关标签: linux qt4