Я действительно в тупике и надеюсь, что кто-то там знает что-то о моей проблеме.Зачем удалять объект Qt (QSslSocket), вызывают сбои
У меня есть очень простой клиент и сервер SSL. Соединение прекрасное. Общение прекрасное. Проблема возникает, когда клиент отключается от сервера. Это вызывает сигнал на сервере, который обрабатывается в SLOT error_handler(QAbstractSocket::SocketError in_error)
. В этой функции я должен представить, что объект sslSocket
должен быть удален.
Однако это приводит к сбою в работе сервера. Я не понимаю, что происходит. Я ожидал, что это будет очень просто, но, видимо, мне не хватает какой-то Qt (или другой) концепции.
Может ли кто-нибудь помочь?
код Essential сервер:
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 !!!!!!
}
}
Вы удаляете объект, который выполняет вызов обработчика ошибок. Это не может быть хорошо. – Mat
Я? Обработчик ошибок является членом «этого», который является объектом SSLServer. Это не то, что я пытаюсь удалить. Объект sslSocket - это то, что я пытаюсь удалить. Он приходит и идет с соединениями. Объект SSLServer присутствует на протяжении всей программы. Не понял ли я что-то в том, что вы говорите? Благодарю. – driftwood
Вы подключили сигнал 'sslSocket' к этому слоту.Эмитентом является тот, кто называет слот (для прямых подключений в любом случае). т. е. как только ваш слот заканчивается, код возвращается обратно в код sslSocket с удаленным «этим». Это очень плохо. – Mat