什么是QTcpSocket在网络过载时的行为?

时间:2010-09-23 11:53:03

标签: qt sockets

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

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

QTcpSocket将缓冲您写入的所有内容,并在下次运行事件循环时尝试尽可能多地写入。 你必须通过检查socket-&gt; bytesToWrite()来做你自己的“流量控制”,它告诉你Qt缓冲区中还有多少(+你的OS缓冲区中还有你无法控制的数据)< / p>

答案 2 :(得分:0)

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

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

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