gpt4 book ai didi

c++ - 为什么删除 Qt (QSslSocket) 对象会导致崩溃

转载 作者:太空狗 更新时间:2023-10-29 23:45:31 28 4
gpt4 key购买 nike

我真的很困惑,希望有人知道我的问题。

我有一个非常简单的 SSL 客户端和服务器。连接很好。沟通很好。当客户端与服务器断开连接时,就会出现问题。这会在服务器上触发一个信号,该信号在 SLOT error_handler(QAbstractSocket::SocketError in_error) 中处理。我想,在该函数中必须删除 sslSocket 对象。

但是这样做会导致服务器出现段错误。我不明白这是怎么回事。我原以为这会非常简单,但显然我遗漏了一些 Qt(或其他)概念。

有人可以帮忙吗?

基本服务器代码:

void SSLServer::incomingConnection(int sd)
{
sslSocket = new SSLSocket(this);
if( sslSocket->setSocketDescriptor(sd))
{
QFile sslkeyfile(privKey_);
sslSocket->setPrivateKey(QSslKey(sslkeyfile.readAll(),QSsl::Rsa));

QFile cliCertFile(serverCert_);
sslSocket->setLocalCertificate(QSslCertificate(cliCertFile.readAll()));

QFile certFile(caCert_);
sslSocket->addCaCertificate(QSslCertificate(certFile.readAll()));

sslSocket->setPeerVerifyMode(QSslSocket::VerifyPeer);
sslSocket->setProtocol(QSsl::SslV3);

connect(sslSocket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(error_handler(QAbstractSocket::SocketError)));
connect(sslSocket, SIGNAL(sslErrors(QList<QSslError>)),
this, SLOT(ssl_error_handler(QList<QSslError>)));
connect(sslSocket, SIGNAL(encrypted()), this,
SLOT(ready()));
connect(sslSocket, SIGNAL(readyRead()), this,
SLOT(read_data_from_client()));

sslSocket->startServerEncryption();
if(!sslSocket->waitForEncrypted())
{
qDebug() << "failed to perform SSL handshake with client";
return;
}
}

}

void SSLServer::read_data_from_client()
{
QByteArray qstrbytes = sslSocket->readAll();
qDebug() << Q_FUNC_INFO << qstrbytes;
}

void SSLServer::ready()
{
QSslCertificate clientCert = sslSocket->peerCertificate();
qDebug() << clientCert.isValid();
}

void SSLServer::error_handler(QAbstractSocket::SocketError in_error)
{
qDebug() << Q_FUNC_INFO << in_error;
if(in_error == QAbstractSocket::RemoteHostClosedError)
{
delete sslSocket; //// line causes crash !!!!!!
}
}

最佳答案

使用QObject::deleteLater()而不是 delete 因为 QSslSocket继承QObject .当您只是 delete 对象时,您可能仍然会在导致崩溃的套接字上收到消息。

sslSocket->deleteLater();

当您调用deleteLater() 时,Qt 会自动断开所有槽和信号的连接,并在没有未决事件传递给对象后调用对象析构函数。参见 QObject::~QObject()获取更多信息。

关于c++ - 为什么删除 Qt (QSslSocket) 对象会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18472054/

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