C++ QTcpSocket::write-如何写入大文件?
的qt文档说明: 将数据中最多maxSize字节的数据写入设备。返回实际写入的字节数,如果发生错误,返回-1 但我在网上找到的每一个代码示例似乎都是这样使用的:C++ QTcpSocket::write-如何写入大文件?,c++,qt,sockets,tcp,qtcpsocket,C++,Qt,Sockets,Tcp,Qtcpsocket,的qt文档说明: 将数据中最多maxSize字节的数据写入设备。返回实际写入的字节数,如果发生错误,返回-1 但我在网上找到的每一个代码示例似乎都是这样使用的: QByteArray block; ... fill the block... socket->write(block); 或如下 QByteArray block; ... fill the block... auto written_bytes = socket->write(block); if(written_by
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()..
QByteArray块;
... 填满这个街区。。。
自动写入字节=套接字->写入(块);
if(写入的字节数
假设我有一个大文件(比如2GB)要发送,我应该使用第一种方法还是后一种方法?我怀疑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);
}
QByteArray块;
... 用2GB的数据填充块。。。
自动写入的字节=0;
while(写入字节<2GB){
//每次我们离开的地方都要重新开始
写入字节+=套接字->写入(块+写入字节,2GB-写入字节);
}
我很困惑您需要继续以合理大小的块读取文件,并将这些块提供给套接字。您可以动态调整块大小,以使套接字以较小的开销流式传输,也就是说,对低传输缓冲区水印作出反应的代码的活动频率不应超过每秒十几次左右。对于非常大的文件,就像您的情况一样,目标是每秒重新填充一次
请参阅示例代码。您需要继续以大小合理的块读取文件,并将这些块提供给套接字。您可以动态调整块大小,以使套接字以较小的开销流式传输,也就是说,对低传输缓冲区水印作出反应的代码的活动频率不应超过每秒十几次左右。对于非常大的文件,就像您的情况一样,目标是每秒重新填充一次
参见示例代码。实际TCP/IP数据包大小(以太网上的MTU)约为1500字节,因此您的数据将被分块。写下对你来说最明显且易于维护的内容。哦,那么,对于5-6字节的小“ping”来说,它绝对安全/合理吗,如果
write
无法写入这5-6个字节,就抛出一个错误?除非使用非阻塞套接字,否则读/写操作将阻塞。我认为QByteArray
中有2GB数据也是一个坏主意,您需要以块的形式读取和发送数据@RichardCriten这是Qt。默认情况下,套接字是异步的。实际的TCP/IP数据包大小(以太网上的MTU)约为1500字节,因此您的数据将被分块。写下对你来说最明显且易于维护的内容。哦,那么,对于5-6字节的小“ping”来说,它绝对安全/合理吗,如果write
无法写入这5-6个字节,就抛出一个错误?除非使用非阻塞套接字,否则读/写操作将阻塞。我认为QByteArray
中有2GB数据也是一个坏主意,您需要以块的形式读取和发送数据@RichardCriten这是Qt。默认情况下,套接字是异步的。
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);
}