Название: "пустые" параллельные tcp-коннекты Отправлено: MonoSlon от Январь 28, 2013, 15:38 Здравствуйте.
Мы пишем десктопное приложение на Qt 4.8.2. Приложение, помимо всего прочего, запрашивает по http и https различную информацию с наших веб-серверов, используя QNetworkAccessManager. Выяснилось, что приложение открывает одновременно несколько tcp-соединений с вебсервером, при этом используются не все коннекты. Эти пустые коннекты висят до тех пор, пока либо приложение не закроется, либо веб-сервер не закроет их по таймауту. Причем, в некоторых случаях, соединение устанавливается и сразу же закрывается посылкой пакета от клиента с флагами ACK+RST выглядит это примерно так: CLNTIP.51584 > SRVIP.8443: S 2756740918:2756740918(0) SRVIP.8443 > CLNTIP.51584: . ack 1 win 12 CLNTIP.51584 > SRVIP.8443: R 1:1(0) ack 1 win 0 пример кода, который воспроизводит такое поведение: file main.cpp: Код: #include <QCoreApplication> Код: #ifndef SAMPLE_H Код: #include <Sample.h> Как я понял, Qt создает такие "запасные" коннекты, чтобы повысить скорость выполнения параллельных запросов, и, наверное, наиболее целесообразно это для мобильных и приложений и для браузеров (например, хром тоже окрывает дополнительный коннект). Есть ли возможность запретить приложению открывать такие "запасные" каналы? А то почти все логи веб-сервера забиты записями "400 bad request". Название: Re: "пустые" параллельные tcp-коннекты Отправлено: Old от Январь 28, 2013, 16:01 Этот пример показывает, что вы генерируете кучу запросов, которые не обрабатываются в силу не запущенной очереди сообщений.
Название: Re: "пустые" параллельные tcp-коннекты Отправлено: MonoSlon от Январь 28, 2013, 16:12 отнюдь, все запросы обрабатываются. но при первых трех запросах приложение открывает сразу 6 каналов (const int QHttpNetworkConnectionPrivate::defaultChannelCount = 6; оно ?)
но сами запросы проходят максимум по трем сокетам, остальные три висят пустые. Название: Re: "пустые" параллельные tcp-коннекты Отправлено: MonoSlon от Январь 28, 2013, 16:18 Прошу прощения за нубский вопрос.. А как запустить очередь сообщений? :) Или, другими словами, что я делаю не так? :)
Название: Re: "пустые" параллельные tcp-коннекты Отправлено: Old от Январь 28, 2013, 16:28 Прошу прощения за нубский вопрос.. А как запустить очередь сообщений? :) Или, другими словами, что я делаю не так? :) QCoreApplication::exec как раз ее и запускает.И как раз в этом цикле обрабатывается select для сокетов сетевых подключений. Название: Re: "пустые" параллельные tcp-коннекты Отправлено: MonoSlon от Январь 28, 2013, 17:30 переделал вот так:
Код: int main(int argc, char *argv[]) Результат не изменился, приложение открывает 6 каналов, все запросы прошли только по одному. Название: Re: "пустые" параллельные tcp-коннекты Отправлено: Old от Январь 28, 2013, 18:46 Результат не изменился, приложение открывает 6 каналов, все запросы прошли только по одному. Я публичных рычагов изменить значение по умолчанию тоже не нашел. |