Итак, я нашел полное решение вопроса, и я думаю, что кому-то это может понадобиться, вот оно:
Первая проблема - это четыре лишних байта.Причина этого заключается в том, что согласно документации QDataStream"каждый элемент, записанный в поток, записывается в предопределенном двоичном формате, который варьируется в зависимости от типа элемента".И поскольку QFile.readAll()
вернул QByteArray
, QDataStream.operator<<
записал этот объект в следующем формате:
- Если байтовый массив равен нулю: 0xFFFFFFFF (quint32)
- В противном случае:размер массива (quint32), за которым следуют байты массива, т.е. байты размера
( ссылка )
Итак, четыре дополнительных байта были четырьмя байтамиquint32, обозначающий размер массива.
Решение, согласно ответу janm, состояло в том, чтобы использовать функцию writeRawBytes()
.
QDataStream ds(socket);
ds.writeRawData(f.readAll().data(), f.size());
Wget, вероятно, сделал это правильно с первого раза, поскольку он строго соблюдаетполе Content-Length
заголовка HTTP, в то время как, по-видимому, Firefox нет.
Вторая проблема заключалась в том, что, несмотря на правильный заголовок и рабочие гнезда, flashplayer не отображал желаемый контент вообще.Я экспериментировал с различными полями, чтобы он работал, и заметил, что при загрузке на реальный сервер все работает нормально.Я скопировал заголовок с сервера, и тадаа!оно работает.Это заголовок:
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Fedora)
Accept-Ranges: bytes
Content-Length: 382917
Content-Type: application/x-shockwave-flash
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Сначала я только попытался установить версию 1.1, но это не помогло.Вероятно, это функция keepalive, но, честно говоря, мне все равно, пока она работает:).