龙空技术网

QSslSocket中与错误相关的信号

QT教程 114

前言:

此时大家对“socket连接错误”可能比较关怀,朋友们都需要学习一些“socket连接错误”的相关内容。那么小编同时在网摘上汇集了一些关于“socket连接错误””的相关文章,希望朋友们能喜欢,看官们快快来了解一下吧!

基本概念

放代码前先来看这个信号:

[signal] void QAbstractSocket::stateChanged(QAbstractSocket::SocketState socketState)

当socket状态改变后就会触发这个信息,其中socketState参数为当前socket的状态。

这里要注意的是QAbstractSocket::SocketState是没有注册的元类型,如果是进行队列连接(connect的第四个参数,主要在跨线程时用在本人的其他博文有对于connect第四个参数的详细介绍)就得用Q_DECLARE_METATYPE()声明,以及qRegisterMetaType进行注册(同样也有对应的博文讲解)

[signal] void QAbstractSocket::error(QAbstractSocket::SocketError socketError)

当有错误发送的时候,就会触发这个信号,参数为这个错误的描述。

这里官方给了一个建议:当socket没有连接上的时候,也会触发这个信号,但可以使用事件循环机制避免,比如使用QTimer::singleShot()设置延迟时间。

这里官方给出了一个connect例子

connect(abstractSocket, static_cast<void(QAbstractSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error),[=](QAbstractSocket::SocketError socketError){ /* ... */ });

下面来看最后一个信号:

[signal] void QSslSocket::sslErrors(const QList<QSslError> &errors)

这个信号主要是在ssl握手后才会发出的,此类错误通常为连接错误,比如不能标识对方等等

官方也给出了一些提议,如果想忽略错误继续连接,可以使用QSslSocket::ignoreSslErrors(),或者调用sslErrors()在后期进行处理。

代码与实例

程序跑了几十秒后,我把网断了,运行截图如下:

源码如下:

#include <QCoreApplication>#include <QSslSocket>#include <QAbstractSocket>#include <QSslCipher>#include <QObject>#include <QDebug>#include <QList>#include <QEventLoop>#include <QSslError>int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QSslSocket *socket = new QSslSocket;socket->connectToHostEncrypted(";, 443);QObject::connect(socket, static_cast<void(QSslSocket::*)(QAbstractSocket::SocketState)>(&QSslSocket::stateChanged),[=](QAbstractSocket::SocketState state){qDebug() << "The socket state is : " << state;});QObject::connect(socket, &QSslSocket::encrypted, [=](){QSslCipher ciph = socket->sessionCipher();QString cipher = QString("%1, %2 (%3/%4)").arg(ciph.authenticationMethod()).arg(ciph.name()).arg(ciph.usedBits()).arg(ciph.supportedBits());;qDebug() << "the cipher info is : " << cipher;});QObject::connect(socket, static_cast<void(QSslSocket::*)(QAbstractSocket::SocketError)>(&QSslSocket::error), [=](QAbstractSocket::SocketError error){qDebug() << "The error is : " << error;});QEventLoop loop;QObject::connect(socket, SIGNAL(sslErrors(QList<QSslError>)), &loop, SLOT(quit()));loop.exec();qDebug() << socket->sslErrors();return a.exec();}

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:「链接」

标签: #socket连接错误