是否可以创建一个新的QSslSocket并使其获得现有TCP连接的所有权,并且丢弃旧的QTcpSocket,而不中断或关闭TCP连接?
我需要这个在我的FTP服务器中实现显式FTPS,这要求最初连接是未加密的,并且只有在FTP客户端的请求(命令AUTH SSL
或AUTH TLS
)时,如果它来了完全启动SSL / TLS握手。
答案 0 :(得分:7)
是的,这是可能的。最简单的方法是将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