[英]Qt QIODevice::write / QTcpSocket::write and bytes written
我們對QIODevice::write
的行為以及具體的QTcpSocket
實現非常困惑。 已經有類似的問題 ,但答案並不令人滿意。 主要的混淆源於那里提到的bytesWritten
信號和waitForBytesWritten
方法。 這兩個似乎表明從QIODevice
使用的緩沖區寫入到實際底層設備的字節(必須有這樣的緩沖區,否則該方法沒有多大意義)。 那么問題是,如果QIODevice::write
返回的數字與此數字相對應,或者在這種情況下,它表示存儲在內部緩沖區中的字節數,而不是寫入底層設備的字節數。 如果返回的數字表示寫入內部緩沖區的字節,我們需要使用如下的模式來確保寫入所有數據:
void writeAll(QIODevice& device, const QByteArray& data) {
int written = 0;
do {
written = device.write(data.constData() + written, data.size() - written);
} while(written < data.size());
}
但是,如果QIODevice::write
的返回值與bytesWritten
信號的含義相對應,則會插入重復數據。 文檔對此非常困惑,因為在兩種方法中都使用了“ 設備”這個詞,即使它似乎是邏輯和一般的理解,一個實際上指示寫入緩沖區而不是設備。
總而言之,問題是: QIODevice::write
返回的數字是否寫入寫入底層設備的字節數,因此保存為調用QIODevice::write
而不檢查返回的字節數,因為所有內容都存儲在內部緩沖區。 或者它是否表明它可以在內部存儲多少字節,並且必須采用類似上述writeAll
的模式來安全地將所有數據寫入設備?
(更新:看一下源代碼, QTcpSocket::write
實現實際上永遠不會返回比想要寫的更少的字節,所以上面的writeAll
不需要。但是,這是特定於套接字和這個Qt版本,文檔是仍然令人困惑...)
QTcpSocket
是一個緩沖的QAbstractSocket
。 在QAbstractSocket
內部分配內部緩沖區,並將數據復制到該緩沖區中。 write的返回值是傳遞給write()
的數據的大小。
waitForBytesWritten
等待,直到QAbstractSocket
的內部緩沖區中的數據寫入本機套接字。
上一個問題回答了您的問題, QIODevice::write(const char * data, qint64 maxSize)
文檔也是如此:
將最多 maxSize字節的數據從數據寫入設備。 返回實際寫入的字節數,如果發生錯誤,則返回-1。
這可以(並且將在現實生活中)返回少於您請求的內容,並且您可以使用其余內容再次調用write
。
對於緩沖設備 ,此功能等待,直到已將緩沖寫入數據的有效負載寫入設備...
它僅適用於緩沖設備。 並非所有設備都是緩沖的。 如果它們是,並且您寫入的內容少於緩沖區可以容納的內容,則write
可以在設備完成所有數據的發送之前成功返回。
設備不一定是緩沖的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.