QSslSocket中与错误相关的信号|全球播报

2023-04-27 16:00:30     来源:QT教程

基本概念

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


(资料图片)

[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(&QAbstractSocket::error),[=](QAbstractSocket::SocketError socketError){ /* ... */ });

下面来看最后一个信号:

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

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

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

代码与实例

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

源码如下:

#include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QSslSocket *socket = new QSslSocket;socket->connectToHostEncrypted("www.baidu.com", 443);QObject::connect(socket, static_cast(&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(&QSslSocket::error), [=](QAbstractSocket::SocketError error){qDebug() << "The error is : " << error;});QEventLoop loop;QObject::connect(socket, SIGNAL(sslErrors(QList)), &loop, SLOT(quit()));loop.exec();qDebug() << socket->sslErrors();return a.exec();}

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

点击这里:

标签:

包装