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 对象上使用适用的 setter 函数,然后将其作为setSslConfiguration() 函数的参数。接下来处理的所有传入连接都将使用这些设置。

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

连接到该类的信号以响应传入的连接尝试。这些信号与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 ,否则在QSslServer 对象被销毁之前,socket 不会被销毁。如果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 当 协商 PSK 密码套件时会发出该信号,因此需要进行 PSK 验证。socket

使用 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 握手时,会发出该信号。

© 2025 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.