我對QTcpSocket::waitForBytesWritten()
的行爲有點困惑...QTcpSocket :: waitForBytesWritten的行爲?
直到什麼時候該功能被阻止?
- 直到數據寫入OS的內部緩衝區以通過TCP傳輸?
- 直到數據被物理轉換爲TCP數據包併發送出去?
- 在傳輸整個數據並且遠程客戶端確認已收到所有數據包之前?
我看了看文檔,但看起來似乎不太清楚。
我對QTcpSocket::waitForBytesWritten()
的行爲有點困惑...QTcpSocket :: waitForBytesWritten的行爲?
直到什麼時候該功能被阻止?
我看了看文檔,但看起來似乎不太清楚。
一般來說,操作系統只爲第一個問題提供簡單的API--因爲Qt是一個可移植的API,所以最好只依靠它來傳輸到操作系統的緩衝區。如果您需要實際的收據確認,最好由遠程應用程序發送它 - 畢竟,數據可以被遠程確認,但永遠不會讀取遠程的操作系統讀取緩衝區。
如果您需要避免讓遠程端永遠阻塞您,您應該等待QIODevice::bytesWritten
信號並返回到事件循環以完成其他工作,或者只需設置適當的超時時間。一般來說,遠程端可能會在某種程度上阻止你 - 也就是說,它可以拒絕確認,填充本地操作系統緩衝區,此時寫入操作不會使其從Qt到OS;無論waitForBytesWritten()
處於什麼級別,它總是可以被阻止。
因此,bytesWritten
和waitForBytesWritten()
只能用於節流的數據源 - 也就是說,如果你要進入傳遞1G數據的插座上的緊密循環一次全部,你可能最終緩衝它在這個過程中,內存不足。通過用bytesWritten
信號觸發額外的讀/寫操作,可以避免此問題。
我不需要確認收到。我真正想要的是避免客戶端可以通過等待發送ACK來延遲應用程序的情況。 – 2011-01-11 05:50:05