将现有的 QTcpSocket 变形为 QSslSocket

Posted

技术标签:

【中文标题】将现有的 QTcpSocket 变形为 QSslSocket【英文标题】:Morph existing QTcpSocket to QSslSocket 【发布时间】:2013-01-10 12:31:24 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

使用它,我实际上能够在不到一小时的时间内移植一个超过 100k 行的项目以使用 SSL。

编辑

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

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

【讨论】:

以上是关于将现有的 QTcpSocket 变形为 QSslSocket的主要内容,如果未能解决你的问题,请参考以下文章

将现有的数据库模式转换为星型模式

将现有的objective-c静态库转换为swift

如何将现有的回调 API 转换为 Promise?

如何将现有的回调 API 转换为 Promise?

如何将现有的回调 API 转换为 Promise?

如何将现有的回调 API 转换为 Promise?