目录
基本概念
放代码前先来看这个信号:
[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();
}