【发布时间】:2016-07-19 16:42:36
【问题描述】:
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)要发送,我应该使用第一种方法还是后一种方法?我怀疑 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);
}
我很困惑
【问题讨论】:
-
实际 TCP/IP 数据包大小(以太网上的 MTU)约为 1500 字节,因此您的数据将被分块。写出对您来说最明显且易于维护的内容。
-
哦,如果
write无法写入这 5-6 个字节,那么假设一个 5-6 字节的小“ping”是否绝对安全/合理? -
除非您使用非阻塞套接字,否则读取/写入将阻塞。
-
我认为在
QByteArray中有 2GB 的数据也是一个坏主意,您需要分块读取和发送数据。 . . -
@RichardCritten 这是 Qt。套接字默认是异步的。
标签: c++ qt sockets tcp qtcpsocket