TCP接続を中断または閉じることなく、新しいQSslSocketを作成して、既存のTCP接続の所有権を取得し、古いQTcpSocketを破棄することは可能ですか?
FTPサーバーに明示的なFTPSを実装するためにこれが必要です。これには、最初に接続が暗号化されていないことが必要であり、FTPクライアントの要求(コマンドAUTH SSL
またはAUTH TLS
)があった場合にのみ、SSL/TLSハンドシェイクが開始されます。
TCP接続を中断または閉じることなく、新しいQSslSocketを作成して、既存のTCP接続の所有権を取得し、古いQTcpSocketを破棄することは可能ですか?
FTPサーバーに明示的なFTPSを実装するためにこれが必要です。これには、最初に接続が暗号化されていないことが必要であり、FTPクライアントの要求(コマンドAUTH SSL
またはAUTH TLS
)があった場合にのみ、SSL/TLSハンドシェイクが開始されます。
はい、これは可能です。これを行う最も簡単な方法は、をに置き換えることQTcpSocket
ですQSslSocket
。QSslSocket
を呼び出すまで、は通常のQTcpSocket
(暗号化なし)のように動作しますstartClientEncryption
。その後、はQSslSocket
通常のように動作しますQTcpSocket
が、すべての通信はバックグラウンドで暗号化されます。
これを使用して、私は実際に1時間以内にSSLを使用するために100k以上の回線プロジェクトを移植することができました。
対応するメソッドQSslSocket
を呼び出すだけなので、暗号化されていないモードで使用する(実際の)オーバーヘッドはありません。QTcpSocket
たとえば、読み取りメソッド(qsslsocket.cpp
Qt 4.8.3):
if (d->mode == UnencryptedMode && !d->autoStartHandshake) {
readBytes = d->plainSocket->read(data, maxlen);
} else {
//encryption stuff