[Interest] Does QNetworkAccessManager support HTTP persistent connections? (keep-alive)

Sze Howe Koh szehowe.koh at gmail.com
Wed Jul 25 16:38:38 CEST 2018


Hi all,

Revisiting this topic after a hiatus. Thanks for confirming, Thiago and Hamish.

On 13 April 2018 at 10:08, Thiago Macieira <thiago.macieira at intel.com> wrote:
> On quinta-feira, 12 de abril de 2018 15:44:54 PDT Sze Howe Koh wrote:
>> Can QNAM re-use a TCP connection for multiple HTTP requests?
>
> Yes. It's the default. You don't have to do anything to enable it.

In a quick test, I used 1 QNAM to download 12 files simultaneously.
(Windows 10 Pro x64 build 1803, using Qt 5.11.1 + MSVC 2015 32-bit)

In Wireshark, I expected to see my PC send 6 SYNs (because QNAM does 6
connections in parallel and re-uses connections) and 12 GETs (because
I'm downloading 12 files).

However, I saw my PC send 12 SYNs and 12 GETs. I also saw the server
send 12 RSTs, 1 after each file finished downloading. My
interpretation is that the server terminates the connection after each
GET, which prevents connection re-use. Is this expected?

Test code:

    const QStringList urls
    {
        "http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_59/qt.59.win64_msvc2017_64/5.9.0-0-201705291821meta.7z",
        "http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_59/qt.59.win64_msvc2015_64/5.9.0-0-201705291821meta.7z",
        "http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_59/qt.59.win64_msvc2013_64/5.9.0-0-201705291821meta.7z",
        "http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_59/qt.59.win32_msvc2015/5.9.0-0-201705291821meta.7z",
        "http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_59/qt.59.win32_mingw53/5.9.0-0-201705291821meta.7z",
        "http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_59/qt.59.qtwebengine/5.9.0-0-201705291821meta.7z",
        "http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_59/qt.59.qtwebengine.win64_msvc2017_64/5.9.0-0-201705291821meta.7z",
        "http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_59/qt.59.qtwebengine.win64_msvc2015_64/5.9.0-0-201705291821meta.7z",
        "http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_59/qt.59.qtwebengine.win32_msvc2015/5.9.0-0-201705291821meta.7z",
        "http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_59/qt.59.qtvirtualkeyboard/5.9.0-0-201705291821meta.7z",
        "http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_59/qt.59.qtvirtualkeyboard.win64_msvc2017_64/5.9.0-0-201705291821meta.7z",
        "http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_59/qt.59.qtvirtualkeyboard.win64_msvc2015_64/5.9.0-0-201705291821meta.7z"
    };
    QNetworkAccessManager nam;
    for (auto url : urls)
    {
        auto reply = nam.get(  QNetworkRequest( QUrl(url) )  );
        QObject::connect(reply, &QNetworkReply::finished, [=]
        {
            qDebug() << reply->request().url() << reply->readAll().size();
            reply->deleteLater();
        });
    }


Regards,
Sze-Howe



More information about the Interest mailing list