网络过载时 QTcpSocket 的行为是啥?

Posted

技术标签:

【中文标题】网络过载时 QTcpSocket 的行为是啥?【英文标题】:What is QTcpSocket's behaviour when the network is overloaded?网络过载时 QTcpSocket 的行为是什么? 【发布时间】:2010-09-23 11:53:02 【问题描述】:

我在发送大量数据的单独线程中有一个 QTcpSocket。其中一些应用程序分布在网络上。

如何检测我的网络是否过载并且我的套接字是否无法再发送任何内容? QTcpSocket 是否会缓冲所有数据,如何查看正在排队发送的缓冲数据的大小?这会等于 bytesToWrite() 吗?有最大 bytesToWrite() 吗?

如果 QTcpSocket 开始丢弃数据,它将是哪些数据:缓冲区队列中最旧的数据,缓冲区队列中最新的数据,...?

【问题讨论】:

【参考方案1】:

显然不是,我刚刚检查了 Qt 4.5.3 的代码。调用 write() 时,所有数据都放在 QRingBuffer 中(类不是 Qt API 的一部分)。 QAbstractData::writeData() 将数据放入,QAbstractData::flush() 将其取出。没有发现限制此缓冲区大小的检查。 QAbstractSocket::write() 返回的大小始终是数据的大小,或者错误时为 -1。

【讨论】:

【参考方案2】:

QTcpSocket 将缓冲您写入其中的所有内容,并在下次事件循环运行时尝试尽可能多地写入。 您必须通过检查 socket->bytesToWrite() 来进行自己的“流控制”,它会告诉您 Qt 的缓冲区中还有多少(+ 操作系统缓冲区中还有您无法控制的额外数据)

【讨论】:

【参考方案3】:

你应该检查你自己的 bytesToWrite() 并丢弃任何旧/新数据,如果它达到最大值:

if (bytesToWrite() > 16 * 1024 * 1024) 
    // discard data
 else 
    write(moredata);

bytesToWrite() 表示它可以发送多快。您可以检查此值并限制数据速率,以便 bytesToWrite() 始终返回大致相同的大小。

【讨论】:

以上是关于网络过载时 QTcpSocket 的行为是啥?的主要内容,如果未能解决你的问题,请参考以下文章

回答给力追加分。Qt中QTcpSocket 的 connectToHost的问题

QT 使用 QTcpSocket来检测 ip 设备的网络状态

5.关于QT中的网络编程,QTcpSocket,QUdpSocket

49.Qt-网络编程之QTCPSocket和QTCPServer(实现简易网络调试助手)

Qt - 当一个类中有多个 QTcpSocket 时,我如何知道哪个 QTcpSocket 发出了 readyRead 信号?

QT 网络编程问题