我使用此代码通过套接字传输大文件,而内存使用情况没有峰值:

    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,操作系统将其杀死。

最佳答案

经过更多的挖掘,我才找到答案,实际上是在文档中。看来我应该对SSL套接字使用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)));
}

08-06 16:24