Qt文档阅读笔记-QSslSocket中与错误相关的信号

583 篇文章 127 订阅
39 篇文章 1 订阅

目录

 

 

基本概念

代码与实例


 

基本概念

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

[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("www.baidu.com", 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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值