в Qt документации QIODevice::Write говорит:QTcpSocket :: write - как писать большие файлы?
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 Гб) отправить, следует ли использовать первый или последний подход? Я сомневаюсь, что 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 over ethernet) составляет около 1500 байт, поэтому ваши данные будут помечены. Напиши то, что наиболее очевидно для тебя и легко поддерживать. –
О, так это абсолютно безопасно/разумно, скажем, небольшой «пинг» 5-6 байт, чтобы просто выбросить ошибку, если «писать» не удалось записать эти 5-6 байтов? – Dean
Reads/Writes будет блокироваться, если вы не используете неблокирующие сокеты. –