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);
}
我很困惑
答案 0 :(得分:2)
您需要继续以合理大小的块读取文件,并将这些块提供给套接字。您可以动态调整块大小以保持套接字流的开销很小,即对低传输缓冲区水印做出反应的代码不应该每秒运行十几次左右。对于非常大的文件,就像你的情况一样,目标是每秒补充一次。
请参阅this answer代码示例。