gpt4 book ai didi

由于 QSslSocket 的 setLocalCertificate,Qt 控制台应用程序崩溃

转载 作者:太空宇宙 更新时间:2023-11-03 14:27:40 29 4
gpt4 key购买 nike

需要创建一个使用 SSL 连接到客户端的小型服务器应用程序。一次只能连接一个客户端。

每次客户端尝试建立新连接时,都会调用以下函数:

void Control::on_newConnection() {

if (socket != nullptr) return;

logger.appendStandard("New connection received 0");

// New connection is available.
socket = (QSslSocket*)(listener->nextPendingConnection());

logger.appendStandard("New connection received 1");

if (!socket->isValid()) {
logger.appendError("ERROR: Could not cast incoming socket connection");
return;
}

logger.appendStandard("New connection received 2");

// Doing the connections.
connect(socket,SIGNAL(encrypted()),this,SLOT(on_encryptedSuccess()));
connect(socket,SIGNAL(sslErrors(QList<QSslError>)),this,SLOT(on_sslErrors(QList<QSslError>)));
connect(socket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(on_socketStateChanged(QAbstractSocket::SocketState)));
connect(socket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(on_socketError(QAbstractSocket::SocketError)));
connect(socket,&QSslSocket::readyRead,this,&Control::on_readyRead);
connect(socket,&QSslSocket::disconnected,this,&Control::on_disconnected);

logger.appendStandard("New connection received 3");

// The SSL procedure.
socket->setPrivateKey(":/certificates/server.key");
logger.appendStandard("New connection received 3.1");
socket->setLocalCertificate(":/certificates/server.csr");
logger.appendStandard("New connection received 3.2");
socket->setPeerVerifyMode(QSslSocket::VerifyNone);
logger.appendStandard("New connection received 3.2");
socket->startServerEncryption();

logger.appendStandard("New connection received 4");

}

服务器是一个保持运行、监听连接的应用程序。建立连接后,我会根据客户端的要求做一些事情,然后使用此功能删除连接。

void Control::clearSocket(const QString &fromWhere){
if (socket != nullptr){
logger.appendStandard(fromWhere + ": About to delete socket");
delete socket;
socket = nullptr;
logger.appendStandard(fromWhere + ": Socket deleted!");
}
}

这在客户端第一次发出请求时就完美无缺。建立连接,服务器收到请求,客户端收到应答,然后在客户端关闭时删除服务器中的连接。

然而,当我想第二次执行完全相同的事务时,服务器程序在这一行崩溃了:

    socket->setLocalCertificate(":/certificates/server.csr");

由于日志消息,我知道这一点。

有谁知道为什么会发生这种情况?

最佳答案

可能是事件队列中与已删除的基于 QObject 的套接字对象相关的某些内容导致了崩溃。

要安全删除,请使用 socket->deleteLater()而不是直接调用删除。它通过事件循环安排删除对象,并且该对象的任何未决事件将从事件队列中删除。

关于由于 QSslSocket 的 setLocalCertificate,Qt 控制台应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55634421/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com