2

このコードを使用して、メモリ使用量のスパイクなしでソケットを介して大きなファイルを転送します。

    connect(socket, SIGNAL(bytesWritten(qint64)), this, SLOT(refillSocketBuffer(qint64)));
    refillSocketBuffer(128*1024);
}

void FtpRetrCommand::refillSocketBuffer(qint64 bytes)
{
    if (!file->atEnd()) {
        socket->write(file->read(bytes));
    } else {
        socket->disconnectFromHost();
    }
}

これは で正常に動作しますQTcpSocketが、暗号化された QSslSocket を使用すると、bytesWritten()信号が常に送信され、ソケットを介してデータを送信するよりもはるかに速く関数が常にソケットに書き込みを行うため、最終的にメモリ使用量は 400 になります。 MBとOSがそれを殺します。

4

1 に答える 1

3

もう少し掘り下げた後、答えを見つけました。実際にはドキュメントにありました。encryptedBytesWritten()代わりに SSL ソケットに使用する必要があるようです。

注: bytesWritten() シグナルと encryptedBytesWritten() シグナルの違いに注意してください。QTcpSocket の場合、データが TCP ソケットに書き込まれるとすぐに bytesWritten() が発行されます。QSslSocket の場合、データが暗号化されているときに bytesWritten() が発行され、データが TCP ソケットに書き込まれるとすぐに encryptedBytesWritten() が発行されます。

したがって、このコードを変更する必要がありました:

connect(socket, SIGNAL(bytesWritten(qint64)), this, SLOT(refillSocketBuffer(qint64)));

これに:

if (socket->isEncrypted()) {
    connect(socket, SIGNAL(encryptedBytesWritten(qint64)), this, SLOT(refillSocketBuffer(qint64)));
} else {
    connect(socket, SIGNAL(bytesWritten(qint64)), this, SLOT(refillSocketBuffer(qint64)));
}
于 2014-01-25T13:30:03.097 に答える