2010-09-23 15 views
3

我在一个单独的线程中发送大量数据的QTcpSocket。其中几个应用程序遍布网络。什么是QTcpSocket在网络过载时的行为?

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

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

回答

2

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

1

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

0

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

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

bytesToWrite()是它能够多快地被发送的指示。你可以检查这个值并扼制数据速率,这样bytesToWrite()总是返回大约相同的大小。

相关问题