【问题标题】:Qt - simple Http serverQt - 简单的 Http 服务器
【发布时间】:2019-07-29 10:11:00
【问题描述】:

我编写了简单的 Http 服务器(仅用于获取和解析请求)。 但它似乎无法正常工作:有时我收到错误“访问冲突(c0000005)”

UPD:我已遵循建议并更改了来源:

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);
            }
        });
    });
}

此代码永远不会抛出错误“访问冲突 (c0000005)”吗?

【问题讨论】:

  • 您正在通过引用捕获堆栈变量alreadyDeleted,但堆栈帧很快就消失了(在两次调用连接之后)。无论如何你都不需要它,因为如果对象已经被销毁(销毁断开信号处理程序),处理程序将无法触发。
  • unique_ptr 会解决这个问题吗?
  • 完全摆脱alreadyDeleted 变量。你不需要它。
  • 在这种情况下 deleteLater() 将被调用几次...
  • 每个断开连接的套接字都应该调用 1。对于已断开连接的套接字,您不应获得额外的断开连接信号。

标签: c++ qt qtcpsocket qtnetwork qtcpserver


【解决方案1】:

这并不能回答您的问题,但您可以考虑使用正在开发的官方 Qt HTTP 服务器。

代码:http://code.qt.io/cgit/qt-labs/qthttpserver.git/

公告:https://blog.qt.io/blog/2019/01/25/introducing-qt-http-server/

【讨论】:

  • 我也为此创建了一个 AUR 包
猜你喜欢
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多