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

时间:2016-07-19 16:42:37

标签: c++ qt sockets tcp qtcpsocket

QIODevice::Write的qt文档说:

qint64 QIODevice::write(const char *data, qint64 maxSize)
  

将最多maxSize字节的数据从数据写入设备。返回实际写入的字节数,如果发生错误,则返回-1。

但我在网上找到的每个代码示例似乎都使用如下:

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)要发送,我应该使用第一种还是后一种方法?我怀疑通过TCP只能在一个块中发送2GB,对吧?

或者我应该使用类似下面的内容?

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

我很困惑

1 个答案:

答案 0 :(得分:2)

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

请参阅this answer代码示例。