2013-01-10 3 views
5

Est-il possible de créer un nouveau QSslSocket et à prendre possession sur la connexion TCP existante, et l'ancien QTcpSocket à être mis au rebut, sans interrompre ou fermer la connexion TCP? J'ai besoin de cela pour implémenter FTPS explicite dans mon serveur FTP, ce qui nécessite que la connexion est initialement non cryptée, et seulement sur la demande du client FTP (la commande AUTH SSL ou AUTH TLS), si elle vient, un SSL/TLS la prise de contact est initiée.Morph QTcpSocket existant QSslSocket

Répondre

6

Oui cela est possible. La manière la plus simple de le faire est de remplacer le QTcpSocket par un QSslSocket. Le QSslSocket se comportera exactement comme un QTcpSocket normal (pas de chiffrement) jusqu'à ce que vous appelez startClientEncryption. Après cela, le QSslSocket se comporte comme un QTcpSocket normal mais toutes les communications sont cryptées en arrière-plan.

L'utilisation de ce que je pouvais réellement au port un projet 100k + lignes à utiliser SSL en moins d'une heure.

Modifier

Il n'y a pas (réel) au-dessus d'utiliser QSslSocket en mode non crypté car il suffit d'appeler la méthode QTcpSocket correspondante. Par exemple, la méthode de lecture (qsslsocket.cpp Qt 4.8.3):

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