Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-56631

"Connection closed" When using QNetworkAccessManager and QTcpServer

    XMLWordPrintable

Details

    • Bug
    • Resolution: Invalid
    • Not Evaluated
    • None
    • 5.5.1, 5.6.2, 5.7.0
    • Network
    • None

    Description

      I have simple server with QTcpServer and simple client with QNetworkAccessManager.

      1. When I request data from the server via curl or browser everything is ok
      2. When I request data from any site via QNetworkAccessManager everything is ok
      3. But I can not read data from QTcpServer via QNetworkAccessManager. All requests are reseted. QNetworkAccessManager (client) had send RST (reset connection) right after it received a data from server. You could see the Wireshark logs. And in client code we get the error: "Connection closed" (RemoteHostClosedError)
      4. Aslo, I tried use QNetworkAccessManager from DownloadManager example and QTcpServer from FortuneServer example in various combinations, but the results were the same.

      Tested Qt Versions:

      • Mac Qt 5.7
      • Linux Qt 5.7
      • Linux Qt 5.6.2
      • Linux Qt 5.5.1

      Wireshark logs:
      https://drive.google.com/file/d/0B0Pb09eHyZTfUThQNTctQVJOUVU/view?usp=sharing

      Wireshark screenshot: qt-wireshark.png
      The upper parts (with red lines) are results of QNetworkAccessManager, and the latest packets with success result are curl attempt to get data from QTcpServer

      Also there is a simple example to reproduce the error in attachments: testNetwork.zip

      And here is sample code:

      Client
      void test(quint16 port)
      {
          QNetworkAccessManager *manager = new QNetworkAccessManager();
      
          QNetworkRequest request;
          request.setUrl(QUrl(QString("http://127.0.0.1:%1/").arg(port)));
      
          manager->connect(manager, &QNetworkAccessManager::finished,
                           [](QNetworkReply *reply) {
              qDebug() << QString("Finished. %1. %2").arg(reply->errorString()).arg(reply->error());
              qDebug() << "readed: " << reply->readAll();
          });
      
          QNetworkReply *reply = manager->get(request);
      
          reply->connect(reply, &QNetworkReply::readyRead, [reply]() {
              qDebug() << QString("readyRead: '%1'").arg(QString(reply->readAll()));
          });
      }
      
      Server
          QTcpSocket socket;
          ...
          if(socket.waitForReadyRead(5000))
          {
              QByteArray request;
              request += socket.readAll();
      
              QByteArray responce("HELLO, WORLD! HELLO, WORLD! HELLO, WORLD! HELLO, WORLD!");
      
              socket.write(responce);
              if(!socket.waitForBytesWritten())
              {
                  qWarning() << QString("Error occurred in waitForBytesWritten() method of the tcp socket. %1 (%2)")
                                .arg(socket.errorString())
                                .arg(socket.error());
              }
          }
          else
          {
              qWarning() << QString("Error occurred in read method of the tcp socket. %1 (%2)")
                            .arg(socket.errorString())
                            .arg(socket.error());
          }
      

      Attachments

        1. qt-wireshark.png
          qt-wireshark.png
          291 kB
        2. testNetwork.zip
          6 kB
        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            richmoore Richard Moore (qtnetwork)
            ildar Gilmanov Ildar
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes