Веб-сервер Qt против мобильных браузеров

Я создал очень простой веб-сервер в qt для очень специфических нужд. Вот так просто давайте получим http-запрос: GET /cover.png HTTP 1.1

ответ отлично поступает на настольные компьютеры. когда я пытаюсь получить изображение с мобильного устройства (я пробовал больше, но скажем, Android + Opera), изображение не загружается. в опере он загружает только около 1/3 изображения, в то время как на стороне сервера qt утверждает, что все байты были отправлены нормально.

я заметил, что это зависит от размера изображения: ~ 4k — это нормально, но 12k — это «слишком много»

Я знаю, что Opera на Android МОЖЕТ загружать изображения гораздо большего размера, поэтому я должен что-то напутать в ответе. но в то же время, опять же, на моем рабочем столе все основные браузеры все хороши.

Я заметил, что после отображения частично загруженного изображения опера открывает новое TCP-соединение с моим сервером, но ничего не отправляет! он пытается загрузить изображение кусками? в http есть такое?

Я действительно теряюсь в том, что здесь наверху...

Обновление: если файл достаточно большой, он не будет работать в среде рабочего стола. Испытанные ограничения: Рабочий стол: макс. 65339 байт Мобильный: макс. 12834 байта

Поскольку ограничения совсем не одинаковы, я не думаю, что это связано с Qt.


person TBari    schedule 14.02.2013    source источник


Ответы (2)


В строке 241 опечатка:

int len = 4096;

должно быть:

int len = 32768;
person user2070719    schedule 14.02.2013
comment
Этот вопрос меня очень заинтересовал. Как вы смогли диагностировать это, я не вижу никакого кода? - person Rob; 14.02.2013

Мне удалось выяснить это: Загрузка образа останавливается, потому что tcp-соединение слишком рано закрывается моим сервером. Это странно, потому что я отправляю ответы так:

socket->write( message );
if( !socket->waitForBytesWritten( 5000 ) )
{ puts( "Timed out!" ); }
emit sent();

Это не работает таким образом. QTcpSocket является буферизованным IODevice, поэтому он должен печатать, если время отправки истекло. Возможно, я что-то неправильно понимаю в waitForBytesWritten(). Итак, оказывается, это все-таки проблема Qt. Если я не удалю сокет после отправки, он работает нормально. Разница в ограничении размера для настольных и мобильных браузеров заключалась в скорости, которую они могут достичь (сколько байтов он может получить, прежде чем я удалю сокет).

Итак, как я могу быть уверен, что все байты действительно отправлены клиенту?

person TBari    schedule 14.02.2013