本页内容

QSslServer Class

通过 TLS 实现了一个加密且安全的 TCP 服务器。更多内容...

头文件: #include <QSslServer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network
自: Qt 6.4
继承自: QTcpServer

公共函数

QSslServer(QObject *parent = nullptr)
virtual ~QSslServer() override
int handshakeTimeout() const
void setHandshakeTimeout(int timeout)
void setSslConfiguration(const QSslConfiguration &sslConfiguration)
QSslConfiguration sslConfiguration() const

信号

void alertReceived(QSslSocket *socket, QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)
void alertSent(QSslSocket *socket, QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)
void errorOccurred(QSslSocket *socket, QAbstractSocket::SocketError socketError)
void handshakeInterruptedOnError(QSslSocket *socket, const QSslError &error)
void peerVerifyError(QSslSocket *socket, const QSslError &error)
void preSharedKeyAuthenticationRequired(QSslSocket *socket, QSslPreSharedKeyAuthenticator *authenticator)
void sslErrors(QSslSocket *socket, const QList<QSslError> &errors)
void startedEncryptionHandshake(QSslSocket *socket)

重新实现的受保护函数

virtual void incomingConnection(qintptr socket) override

详细说明

该类可代替 `QTcpServer ` 用于实现基于传输层安全协议 (TLS) 的 TCP 服务器。

要配置安全握手设置,请在QSslConfiguration 对象上使用相应的设置函数,然后将其作为setSslConfiguration()函数的参数。此后处理的所有传入连接都将使用这些设置。

要开始监听传入连接,请使用从 `QTcpServer` 继承的 `listen()` 函数。其他设置可通过使用从 `QTcpServer ` 类继承的设置函数进行配置。

订阅本类的信号以响应传入的连接尝试。这些信号与QSslSocket 上的信号相同,但还会传递相关套接字的指针。

在响应pendingConnectionAvailable() 信号时,请使用nextPendingConnection() 函数获取下一个传入连接,并将其从待处理连接队列中取出。QSslSocket 是 QSslServer 的子类,将在 QSslServer 被销毁时被销毁。但为了避免浪费内存,在不再需要该对象时,仍建议显式销毁该对象。

另请参阅 QTcpServer 、QSslConfiguration 以及QSslSocket 。

成员函数文档

[explicit] QSslServer::QSslServer(QObject *parent = nullptr)

使用给定的parent 实例创建一个新的QSslServer。

[override virtual noexcept] QSslServer::~QSslServer()

销毁QSslServer 。

所有已建立的连接均被关闭。

[signal] void QSslServer::alertReceived(QSslSocket *socket, QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)

QSslServer 当socket 从对等方接收到了警报消息时,会发出此信号。level 表示该警报是致命错误还是警告。type 是说明发送该警报原因的代码。如果警报消息有文本描述,则通过description 提供。

注意:该 信号主要用于信息提示和调试,应用程序无需对其进行处理。如果警报为致命错误,底层后端将自行处理并关闭连接。

注意:并非 所有后端都支持此功能。

另请参阅 alertSent()、QSsl::AlertLevel 以及QSsl::AlertType 。

[signal] void QSslServer::alertSent(QSslSocket *socket, QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)

QSslServer 如果从socket 向对等方发送了警报消息,则会发出此信号。level 描述了该警报是警告还是致命错误。type 提供了警报消息的代码。当有警报消息的文本描述时,该描述将通过description 提供。

注意:该 信号主要具有信息性,可用于调试目的,通常不需要应用程序采取任何行动。

注意:并非 所有后端都支持此功能。

另请参阅 alertReceived()、QSsl::AlertLevel 以及QSsl::AlertType 。

[signal] void QSslServer::errorOccurred(QSslSocket *socket, QAbstractSocket::SocketError socketError)

当握手过程中发生错误时,会发出此信号。socketError 参数描述了发生的错误类型。

如果套接字握手尚未达到加密状态,则在发出此信号后,socket 将自动被删除。但如果socket 成功加密,则会被插入到QSslServer 的待处理连接队列中。当用户调用QTcpServer::nextPendingConnection()时,用户有责任销毁socket ,否则socket 将不会被销毁,直到QSslServer 对象被销毁为止。 如果socket 在被插入待处理连接队列后发生错误,则不会发出此信号,socket 也不会被移除或销毁。

注意: 连接此信号时不能使用Qt::QueuedConnection ,否则在处理该信号时,socket 已被销毁。

另请参阅 QSslSocket::error() 和errorString()。

[signal] void QSslServer::handshakeInterruptedOnError(QSslSocket *socket, const QSslError &error)

QSslServer 当socket 检测到证书验证错误,且在QSslConfiguration 中启用了早期错误报告时,将发出此信号。应用程序应检查error ,并决定是继续握手,还是中止握手并向对端发送警报消息。信号-槽连接必须是直接的。

另请参阅 QSslSocket::continueInterruptedHandshake()、sslErrors() 以及QSslConfiguration::setHandshakeMustInterruptOnError()。

int QSslServer::handshakeTimeout() const

返回当前配置的握手超时时间。

另请参阅 setHandshakeTimeout()。

[override virtual protected] void QSslServer::incomingConnection(qintptr socket)

重写自:QTcpServer::incomingConnection (qintptr socketDescriptor)。

在建立新连接时被调用。

将socket 转换为QSslSocket 。

[signal] void QSslServer::peerVerifyError(QSslSocket *socket, const QSslError &error)

QSslServer 在 SSL 握手过程中,在加密建立之前,可能会多次发出此信号,以指示在确定对端身份时发生了错误。error 通常表明socket 无法安全地识别对端。

该信号可在出现问题时为您提供早期预警。通过监听该信号,您可以在握手完成之前,从已连接的插槽内部手动选择断开连接。如果不采取任何行动,QSslServer 将继续发出sslErrors() 信号。

另请参阅 sslErrors()。

[signal] void QSslServer::preSharedKeyAuthenticationRequired(QSslSocket *socket, QSslPreSharedKeyAuthenticator *authenticator)

QSslServer 当socket 协商PSK密码套件时,会发出此信号,因此此时需要进行PSK身份验证。

使用 PSK 时,服务器必须提供有效的身份信息和有效的预共享密钥,SSL 握手才能继续进行。应用程序可以通过连接到该信号的插槽提供这些信息,方法是根据自身需求填充传入的authenticator 对象。

注意:忽略 此信号或未能提供所需的凭据,将导致握手失败,从而导致连接被终止。

注意: authenticator 对象由socket 拥有,应用程序不得将其删除。

另请参阅 QSslPreSharedKeyAuthenticator 。

void QSslServer::setHandshakeTimeout(int timeout)

设置用于所有传入握手请求的timeout 值,单位为毫秒。

这在以下场景中尤为重要:当客户端(无论是恶意还是无意)连接到服务器,但未尝试进行通信或发起握手时。此时,QSslServer 将在timeout 毫秒后自动终止该连接。

默认超时时间为 5000 毫秒(5 秒)。

注意: 底层的 TLS框架 现在或将来可能会有自己的超时逻辑,此函数不会影响该逻辑。

注意: 传递给此函数的 timeout 仅适用于新连接。如果客户端已经连接,则将使用连接时设置的超时值。

另请参阅 handshakeTimeout()。

void QSslServer::setSslConfiguration(const QSslConfiguration &sslConfiguration)

设置用于处理所有后续传入连接的sslConfiguration 。

必须在调用 `listen()` 之前调用此函数,以确保在所有握手过程中均使用所需的配置。

另请参阅 sslConfiguration() 和QSslSocket::setSslConfiguration()。

QSslConfiguration QSslServer::sslConfiguration() const

返回当前的 SSL 配置。

另请参阅 setSslConfiguration()。

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

QSslServer 在 SSL 握手完成后发出此信号,以指示在确定对等方身份的过程中发生了一个或多个错误。这些错误通常表明socket 无法安全地识别对等方。除非采取任何措施,否则在发出此信号后,连接将被断开。

若您希望在发生错误的情况下继续连接,必须在连接到该信号的槽内调用QSslSocket::ignoreSslErrors()。若您需要在后续访问错误列表,可调用 sslHandshakeErrors()。

errors 包含一个或多个错误,导致QSslSocket 无法验证对端的身份。

注意: 连接此信号时不能使用Qt::QueuedConnection ,否则调用QSslSocket::ignoreSslErrors()将无效。

另请参阅 peerVerifyError()。

[signal] void QSslServer::startedEncryptionHandshake(QSslSocket *socket)

当连接到socket 的客户端发起 TLS 握手时,会发出此信号。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.