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

标签 c++ qt sockets tcp qtcpsocket

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/

相关文章:

c++ - 在 autoexp.dat 中创建一个简单的 VS2008 可视化工具(转换问题)

c++ - 编码霍夫曼二叉树

c++ - 如何让QT Application写入崩溃日志

c++ - Qt 5.4.2 在 msvc2010 上使用 -no-angle -no-opengl 构建问题

swift - 监控 TCP/IP 流

c++ - 应用程序崩溃时未删除 Unix 域套接字文件

c++ - 如何仅 Hook Windows API 上的键盘焦点

c++ - 如何在 Ubuntu 14.04 的 QT Creator 中使用 Boost 库

c - 应该关闭损坏的 socket 吗?

python - Socket.Error : [Errno 10060] when connecting to MQTT broker