我在一個單獨的線程中發送大量數據的QTcpSocket。其中幾個應用程序遍佈網絡。什麼是QTcpSocket在網絡過載時的行爲?
如何檢測我的網絡是否過載並且我的套接字無法發送任何東西? QTcpSocket是否會緩衝所有數據,我如何看到正在排隊的緩衝數據的大小?這將等於bytesToWrite()嗎?有最大bytesToWrite()嗎?
如果QTcpSocket開始丟棄數據,它會是哪些數據:緩衝區隊列中最舊的,緩衝區隊列中最新的,...?
我在一個單獨的線程中發送大量數據的QTcpSocket。其中幾個應用程序遍佈網絡。什麼是QTcpSocket在網絡過載時的行爲?
如何檢測我的網絡是否過載並且我的套接字無法發送任何東西? QTcpSocket是否會緩衝所有數據,我如何看到正在排隊的緩衝數據的大小?這將等於bytesToWrite()嗎?有最大bytesToWrite()嗎?
如果QTcpSocket開始丟棄數據,它會是哪些數據:緩衝區隊列中最舊的,緩衝區隊列中最新的,...?
顯然它沒有,我只是檢查了Qt 4.5.3的代碼。當調用write()時,所有的數據都放入一個QRingBuffer(類不是Qt API的一部分)。 QAbstractData :: writeData()將數據放入,QAbstractData :: flush()將其拉出。沒有檢查發現限制這個緩衝區的大小。 由QAbstractSocket :: write()返回的大小始終是數據大小或錯誤-1。
QTcpSocket將緩衝您寫入的所有內容,並會在下次事件循環運行時嘗試儘可能多地寫入內容。 你必須通過檢查socket-> bytesToWrite()來做你自己的「流量控制」,它告訴你Qt的緩衝區還有多少(+你的OS緩衝區還會有額外的數據,你無法控制)
您應該檢查bytesToWrite()你自己,如果它達到最大丟棄任何舊/新數據:
if (bytesToWrite() > 16 * 1024 * 1024) {
// discard data
} else {
write(moredata);
}
bytesToWrite()是它能夠多快地被髮送的指示。你可以檢查這個值並扼制數據速率,這樣bytesToWrite()總是返回大約相同的大小。