Solved "Connection closed" When using QNetworkAccessManager and QTcpServer
-
I have simple server with QTcpServer and simple client with QNetworkAccessManager.
- When I request data from the server via curl or browser everything is ok
- When I request data from any site via QNetworkAccessManager everything is ok
- 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)
- 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=sharingWireshark 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 QTcpServerAlso 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
-
@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. - each line should end with
-
@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. - each line should end with
-
@raven-worx Thank you very much for your response!