qtcpsocket只能接收8KB字节的数据,该怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qtcpsocket只能接收8KB字节的数据,该怎么解决相关的知识,希望对你有一定的参考价值。

参考技术A 关于这个问题折腾了我好久,以前做些小练习的时候,用QTcpSocket的write()一数据,然后接收方只要emit一个readyread()信号然后就用QTcpSocket的read()去读。本以为只要发送方write一次,接收方就会响应readyRead信号。其实根本就不是这样的,readyRead不会知道发送方调用了几个write,它只负责在有数据到达时触发,等你真正接收时,或许已经能够收到所有的数据了。这要看你发送的信息量了,如果很少的话,比如发送几个字节的数据当然没有问题,一次readyRead就能读到所有数据但切记,这不是必然的!另外readRead到底能读多少数据是不确定的,这要看你的网速情况,还有你的电脑的性能了。
举个例子,我在编程时用发送方while()连续向网络上传输数据,这个文件的数据量很大,就要使用waitForBytesWritten做一下等待,这就是每次等上一个write()完毕后才继续下一个write()这样数据就不会漏或者乱。还有一个问题是要传输数据时一定要先告诉接收方发的数据量是多大,也就是在发真正的数据时的头部用2个字节(quint16)或四个字节(quint32)去存放传送数据的大小。接收方就是根据这个传输数据的大小和每次bytesAvailable()的大小做对比若小就不断的触发emit的信号,在去接收,知道最终接收的总数据跟发送方的数据大小是一致的就说明接收完毕。这就解决了大数据量连续发送与接收的问题。

接收不到 QTcpSocket 的 readyRead 信号?

【中文标题】接收不到 QTcpSocket 的 readyRead 信号?【英文标题】:Cannot receive readyRead signal of QTcpSocket? 【发布时间】:2012-10-11 03:21:28 【问题描述】:

您使用 QTcpSocket 通过网络发送数据,将 readyRead 信号与您的数据处理程序连接。但是可能没有触发 readyRead 信号。

你可以看到 Wireshark 到达的数据,但是 QTcpSocket 没有触发 readyRead 信号。

【问题讨论】:

正常情况下应该触发readyRead信号。检查你的接收方。 我有相同或类似的问题。 Win7 x64,Qt 5.1。 Wireshark 显示消息到达,但每 4-10 条消息中只有一条会触发 readyRead()。这让我很难过。 【参考方案1】:

如果您创建套接字的线程处于模式对话框中,该模式对话框会进入其自己的事件循环,从而阻止触发 readyRead 信号,则可能会发生这种情况。

我想出了两个解决方案: 1) 使用非模态对话框,提供带有信号的对话框结果。 2)在另一个线程中创建套接字。

【讨论】:

普通的模态对话框不会阻塞事件处理,Qt 会处理。

以上是关于qtcpsocket只能接收8KB字节的数据,该怎么解决的主要内容,如果未能解决你的问题,请参考以下文章

QTcpSocket真的是全双工的吗?

为啥 QTcpSocket 接收到错误的数据?

使用 QTcpSocket 传输文件时出现奇怪的字符

接收不到 QTcpSocket 的 readyRead 信号?

QTcpSocket 从服务器接收数据

QTcpSocket的连续发送数据和连续接收数据