QTcpSocket::write - 如何写入大文件?

QTcpSocket::write - how to write large files?

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 以一个块的形式发送,对吗?

或者我应该使用类似下面的东西?

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);
}

我很困惑

您需要以合理大小的块继续读取文件,并将这些块提供给套接字。您可以动态调整块大小以保持套接字流的开销很小,即您对低传输缓冲区水印做出反应的代码每秒不应超过十几次。对于非常大的文件,就像您的情况一样,目标是每秒重新填充一次。

请参阅 this answer 示例代码。