c++ - 将现有的 QTcpSocket 变形为 QSslSocket

标签 c++ qt qtcpsocket qsslsocket

是否可以创建一个新的 QSslSocket 并让它获得现有 TCP 连接的所有权,并丢弃旧的 QTcpSocket,而不中断或关闭 TCP 连接?

我需要它在我的 FTP 服务器中实现显式 FTPS,这要求最初连接是未加密的,并且仅在 FTP 客户端请求时(命令 AUTH SSLAUTH TLS),如果出现,则启动 SSL/TLS 握手。

最佳答案

是的,这是可能的。最简单的方法是用 QSslSocket 替换 QTcpSocket。在您调用 startClientEncryption 之前,QSslSocket 的行为与普通的 QTcpSocket 完全一样(无加密)。之后 QSslSocket 将像普通的 QTcpSocket 一样工作,但所有通信都在后台加密。

使用它,我实际上能够在不到一小时内移植一个 10 万多行的项目以使用 SSL。

编辑

在未加密模式下使用QSslSocket 没有(真正的)开销,因为它只会调用相应的QTcpSocket 方法。例如读取方法(qsslsocket.cpp Qt 4.8.3):

if (d->mode == UnencryptedMode && !d->autoStartHandshake) {
    readBytes = d->plainSocket->read(data, maxlen);
} else {
//encryption stuff

关于c++ - 将现有的 QTcpSocket 变形为 QSslSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14258022/

相关文章:

qt - 属性绑定(bind)未更新

java - Java 中的尾递归编程

c++ - 获取 cv::Mat 的源 ROI 坐标

c++ - 最佳实践 - session 处理/超时

qt - 从 QDropEvent 检索所有文件路径

c++ - 在 QTcpServer 服务器端出现 : The remote host closed the connection

c++ - 程序由于某种原因挂起

c++ - 如何对 QMap<QString, myStruct> 进行排序?

c++ - 根据子数据对 qtreewidget 顶层项目进行排序

c++ - QThread中的QTcpSocket将commitTransaction但是当调用Write时 "Cannot create children for a parent that is in a different thread."