Qt уеб сървър срещу мобилни браузъри

Създадох много прост уеб сървър в qt за много специфични нужди. Толкова просто, нека имаме http заявка: GET /cover.png HTTP 1.1

отговорът пристига перфектно на настолни компютри. когато се опитам да получа изображението от мобилно устройство (опитах повече, но да кажем android+opera), изображението не се зарежда. в opera зарежда само около 1/3 от картината, докато от страната на сървъра qt твърди, че всички байтове са изпратени добре.

забелязах, че зависи от размера на изображението: ~4k е добре, но 12k е "твърде много"

знам, че opera на android МОЖЕ да зарежда много по-големи изображения, така че трябва да объркам нещо в отговора. но в същото време, отново на моя работен плот, всички основни браузъри са добри.

Забелязах, че след показването на частично зареденото изображение, opera отваря нова 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 е буферирано IOустройство, така че трябва да отпечата, ако изпращането изтече. Може би не съм разбрал нещо за waitForBytesWritten(). Така че се оказва, че все пак това Е проблем с Qt. Ако не изтрия сокета след изпращане, той работи добре. Разликата в ограничението на размера за настолни и мобилни браузъри беше относно скоростта, която могат да постигнат (колко байта може да получи, преди да изтрия сокета).

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

person TBari    schedule 14.02.2013