2010-09-23 59 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()總是返回大約相同的大小。

相關問題