簡體   English   中英

Qt QIODevice :: write / QTcpSocket ::寫入和寫入的字節

[英]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

至於waitForBytesWritten

對於緩沖設備 ,此功能等待,直到已將緩沖寫入數據的有效負載寫入設備...

它僅適用於緩沖設備。 並非所有設備都是緩沖的。 如果它們是,並且您寫入的內容少於緩沖區可以容納的內容,則write可以在設備完成所有數據的發送之前成功返回。

設備不一定是緩沖的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM