QIODevice::Write 的 qt 文档说:
qint64 QIODevice::write(const char *data, qint64 maxSize)
Writes at most maxSize bytes of data from data to the device. Returns the number of bytes that were actually written, or -1 if an error occurred.
但是我在网上找到的每一个代码示例似乎都使用了这个,如下所示:
QByteArray block;
... fill the block...
socket->write(block);
或如下
QByteArray block;
... fill the block...
auto written_bytes = socket->write(block);
if(written_bytes < block.size())
throw error()..
假设我有一个大文件(比方说,2 GB)要发送,我应该使用第一种方法还是第二种方法?我怀疑 2GB 是否可以通过 TCP 以一个 block 的形式发送,对吧?
或者我应该使用类似下面的东西?
QByteArray block;
... fill the block with 2GB of data...
auto written_bytes = 0;
while(written_bytes < 2GB) {
// Restart each time where we previously left
written_bytes += socket->write(block + written_bytes, 2GB - written_bytes);
}
我很困惑
最佳答案
您需要以合理大小的 block 继续读取文件,并将这些 block 提供给套接字。您可以即时调整 block 大小以保持套接字流的开销很小,即您对低传输缓冲区水印使用react的代码每秒不应超过十几次。对于非常大的文件,就像您的情况一样,目标是每秒重新填充一次。
参见 this answer例如代码。
关于c++ - QTcpSocket::write - 如何写入大文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38464163/