Надо реализовывать свой протокол. Например разбить траффик на управляющие команды. Простейший вариант:
C++ (Qt)
enum OpCode {
E_GETFILE,
E_SENDFILE
}
Формат пакета может быть таким:
struct SendFile {
qint64 szPacket;
OpCode opcode = E_SENDIFLE;
qint64 szFile;
quint32 fileCRC;
const char data[szFile];
}
Если сервер получает что-то от клиента, то мы уже заранее знаем размеры "кусков", т.к. размер приходит первыми байтами и если приходит больше данных чем указано в "заголовке" пакета, то это начало нового. Если меньше, то значит надо дожидаться пока прийдет следующая порция данных. Главное, чтобы клиент и сервер знали точный и фиксированный размер поля szPacket.