将现有的 QTcpSocket 变形为 QSslSocket
Posted
技术标签:
【中文标题】将现有的 QTcpSocket 变形为 QSslSocket【英文标题】:Morph existing QTcpSocket to QSslSocket 【发布时间】:2013-01-10 12:31:24 【问题描述】:是否可以创建一个新的 QSslSocket 并让它接管现有的 TCP 连接,并丢弃旧的 QTcpSocket,而不中断或关闭 TCP 连接?
我需要它来在我的 FTP 服务器中实现显式 FTPS,这要求最初的连接是未加密的,并且只有在 FTP 客户端的请求(命令 AUTH SSL
或 AUTH TLS
)时,如果它出现,一个SSL/TLS 握手已启动。
【问题讨论】:
【参考方案1】:是的,这是可能的。最简单的方法是将QTcpSocket
替换为QSslSocket
。 QSslSocket
的行为与普通的 QTcpSocket
完全相同(无加密),直到您调用 startClientEncryption
。之后,QSslSocket
将像普通的QTcpSocket
一样工作,但所有通信都在后台加密。
使用它,我实际上能够在不到一小时的时间内移植一个超过 100k 行的项目以使用 SSL。
编辑
在未加密模式下使用QSslSocket
没有(实际)开销,因为它只会调用相应的QTcpSocket
方法。例如读取方法(qsslsocket.cpp
Qt 4.8.3):
if (d->mode == UnencryptedMode && !d->autoStartHandshake)
readBytes = d->plainSocket->read(data, maxlen);
else
//encryption stuff
【讨论】:
以上是关于将现有的 QTcpSocket 变形为 QSslSocket的主要内容,如果未能解决你的问题,请参考以下文章