2016-07-19 3 views
0

в 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); 
} 

Я совершенно запутался

+1

Практический размер пакета TCP/IP (MTU over ethernet) составляет около 1500 байт, поэтому ваши данные будут помечены. Напиши то, что наиболее очевидно для тебя и легко поддерживать. –

+0

О, так это абсолютно безопасно/разумно, скажем, небольшой «пинг» 5-6 байт, чтобы просто выбросить ошибку, если «писать» не удалось записать эти 5-6 байтов? – Dean

+1

Reads/Writes будет блокироваться, если вы не используете неблокирующие сокеты. –

ответ

2

Вы должны продолжать читать файл в разумных размеров кусков, и кормить эти куски к гнезду. Вы можете настроить размер куска на лету, чтобы поддерживать поток сокетов с небольшими накладными расходами, т. Е. Ваш код, реагирующий на низкий водяной знак буфера передачи, не должен быть активным более десятка раз в секунду или около того. Для очень больших файлов, как в вашем случае, старайтесь пополнить один раз в секунду.

См., Например, код this answer.

Смежные вопросы