2013-01-10 35 views
5

是否有可能創建一個新的QSslSocket併爲它獲取對現有TCP連接的所有權,並丟棄舊的QTcpSocket而不中斷或關閉TCP連接?Morph現有的QTcpSocket到QSslSocket

我想這能實現我的FTP服務器,即要求最初的連接是加密的,並且僅在FTP客戶端的請求(命令AUTH SSLAUTH TLS),如果它在所有的,一個SSL/TLS明確FTPS握手開始。

回答

6

是的,這是可能的。最簡單的方法是將QTcpSocket替換爲QSslSocket。在撥打startClientEncryption之前,QSslSocket的行爲與正常的QTcpSocket(無加密)完全相同。之後,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