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

	前提说明:QT是在windows下的,服务器是linux下的

问题1:这次项目是用QT收数据,我从Llinux服务器发图片包过来,采用分片传输的方法。然后QT这边是用TCPsocket接收,发一个包就接受一次,然后写入文件中保存,直到最后一个包过来关闭文件,就能完成一张图片的传输。然后做的时候是,一开始测试每次发过来的图片数据1024个字节,采用crc校验。全程没啥问题,然后就觉得传输的太慢了,想要传2048个字节。这次就传了5个包,第5个包的包头没有错,但是crc校验包体也就是图片数据是错的校验失败了,第6个包开始就是连包头的数据全部都错乱,读出来的数据变成一个很大的随机数。一开始我以为是我代码问题,我就去查,查了很久,感觉代码没啥问题,毕竟传1024时候都没事。我就去查资料,我发现,QT他这个东西,你一次传输的数据越大,他满包的概率就越小,比如你传4000字节,他可能一次收2500,然后再收一次1500都不一定。所以当你再接收函数那边写每次接收那么大的字节,可能他这次接收的根本就没那么多字节。这时候因为你操作你读取的东西,就很有可能出现段错误,导致程序奔溃。
问题2:丢包问题,服务器发了1000个包,然后客户端就收到900个就不接收了。
问题2分析:经过实验tcp下还是稳定的除非是带宽限制导致丢包。我这次碰到这个问题是因为,我读取的方法是用信号和槽去绑定qtcpsocket的readyread信号,就是一有数据来就会触发的哪个信号。然后在槽里面去read把数据取出来。因为读取完之后有个操作时间导致,读取的速度更不上服务器发的速度,然后当服务器发了1000包后停止发送,我客户端只接收处理了900个包。剩下的包都在缓冲区没有取出来。
解决办法:重新开一个线程专门做tcp的收发工作(注意这里最好把有关tcp的操作包括创建,读写等全部都放线程里面去做,不然会出现跨线程使用tcp的问题程序异常退出)然后创建完后使用tcpSocket->waitForReadyRead(900);括号里面可以调整等待时间,在这个等待期间如果收到信号就不会等待,你可以直接read去读取数据,不然就在等待后去主动读取数据然后看read的返回值是否>=0.来判断是否有数据。
tcpSocket->waitForReadyRead(900);
ret=tcpSocket->read((char *)Head_Read,sizeof(HEADER_T)); //接收包头消息
if(ret<=0)
{
continue;
}

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

你可能感兴趣的:(使用QT时有关TCPScoket收发数据包,数据错误问题)