"Connection closed" When using QNetworkAccessManager and QTcpServer



  • 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: testNetwork.zip

    And here is sample code for 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()));
        });
    }
    

    and for 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());
        }
    

    Also I created a Bug Report


  • Moderators

    @Ildar said in "Connection closed" When using QNetworkAccessManager and QTcpServer:

    Also I created a Bug Report

    This is not a bug!
    Since you are using QNetworkAccessManager you are sending HTTP requests to your server. And QNAM of course expects a HTTP response.

    At least the response should look like the following.

    Note:

    • each line should end with \r\n
    • an empty line separates the header- and content-section
    • Content-Length header is the byte-count of the content
    HTTP/1.1 200 OK
    Date: Thu, 20 Oct 2016 12:28:53 GMT
    Server: MyServer 1.0.0
    Content-Length: 3
    Content-Type: text/plain
    Connection: Closed
    
    XXX
    

    You are simply sending the content directly. So no status line (HTTP/1.1 200 OK) to indicate the result, thus QNAM closes the connection due to an unexpected response.



  • @raven-worx Thank you very much for your response!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.