Соответсвенно работа идет через буфер ввода-вывода.
1. Считываете заголовок с фиксированным размером (размер буфера больше длины заголовка).
2. Выясняете размер передаваемых данных и считываете в буфер оставшиеся данные
В текущей ситуацией с размером памяти можно считывать напрямую в QByteArray.
Имхо прежде чем все реализовать продумайте логику комманд протокола.
Как-то не совсем понятно..
Через буфер ввода-вывода - это QDataStream?! Как-то с ним мало работал.. Всегда было проще фиксированную структуру записать в сокет, затем ее же и вычитать.. в чем преимущество в данном случае QDataStream, он не будет бить данные и все считает за раз?
Например вам нужно передать бинарные файлы неизвестной длины.
Буфер ввода-вывода в данном случае это массив байт которые вы считываете, но пока не обрабатываете.
Например ваш буфер - это массив байт (допустим 1Мб).
По сигналу readyread() вы этот массив заполняете данными с начала массива.
Точно известно (по вашей версии протокола), что первые 4 байта это размер файла. Затем идут данные файла.
Окончание потока данных это размер следующего файла 0.
Принцип работы протокола
1. Считывете из вашего буфера размер файла - 4байта. Если 0 то выходите.
2. Создаете новый QByteArray
3. Считываете данные из буфера в этот QByteArray
4. Данные из буфера удаляете (считанные)
5. Получете файл
6. Переходите к пункту 1
=========================================================
одной из которых будет заголовок с нужной инфой, во второй части естественно нет. Поэтому происходит неправильное чтение из сокета, ну и дальнейшая каша.
===========================================================
Читайте данные через промежуточный буфер ввода-вывода. Все приходящие части нужно добавлять в единое целое.
И только потом обрабатывать. В Вашем случае нужно начинать обработку только когда вы получаете весь массив данных.
Пишите протокол передачи данных на бумаге . В вашем алгоритме не учитвается раздробление данных при передаче