将现有的QTcpSocket变为QSslSocket

时间:2013-01-10 12:31:25

标签: c++ qt qtcpsocket qsslsocket

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

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

1 个答案:

答案 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