Reputation: 39
I have written simple Http server (only for getting and parsing requests). But it doesn't seems to work properly: sometimes i'm getting error "Access violation (c0000005)"
UPD: i have followed suggestions and changed source:
Server::Server()
{
tcpServer = new QTcpServer();
if (!tcpServer->listen(QHostAddress::Any, 1111)) {
return;
}
QObject::connect(tcpServer, &QTcpServer::newConnection, [=]() {
QTcpSocket *clientSocket = tcpServer->nextPendingConnection();
QObject::connect(clientSocket, &QTcpSocket::disconnected, clientSocket, &QTcpSocket::deleteLater);
QObject::connect(clientSocket, &QTcpSocket::readyRead, [this, clientSocket]() {
const QString line = QUrl::fromPercentEncoding(clientSocket->readLine());
clientSocket->disconnectFromHost();
const QStringList tokens = QString(line).split(QRegExp("[ \r\n][ \r\n]*"));
if (parseParams(tokens)) {
emit Server::newRequest(params);
}
});
});
}
Will this code never throw an error "Access violation (c0000005)"?
Upvotes: 0
Views: 4097
Reputation: 76
Server::run()
{
m_server = new QTcpServer();
m_server->listen(QHostAddress::Any, 1111);
connect(m_server, SIGNAL(newConnection()), SLOT(ConnectClient()));
}
Server::ConnectClient()
{
QTcpSocket *client = m_server->nextPendingConnection();
if(client)
{
client->waitForReadyRead(1000);
QByteArray data = client->readAll();
// you can get request
std::string szRequest = data.toStdString();
// make response
QByteArray codSuccess = "HTTP/1.1 200 OK\r\n\r\n success";
client->wirte(codSucces);
}
connect(client, SIGNAL(disconnected)), client, SLOT(deleteLater()));
client->disconnectFromHost();
}
Upvotes: 0
Reputation: 2107
This doesn't answer your question, but you may consider to use the official Qt HTTP server under development.
code: http://code.qt.io/cgit/qt-labs/qthttpserver.git/
announcement: https://blog.qt.io/blog/2019/01/25/introducing-qt-http-server/
Upvotes: 4