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和操作系统杀死它。

4

1 回答 1

3

经过更多挖掘后,我才找到了答案,实际上它在文档中。看来我应该改用encryptedBytesWritten()SSL 套接字:

注意:注意 bytesWritten() 信号和 encryptedBytesWritten() 信号之间的区别。对于 QTcpSocket,一旦数据写入 TCP 套接字,就会发出 bytesWritten()。对于 QSslSocket,bytesWritten() 将在数据被加密时发出,而 encryptedBytesWritten() 将在数据写入 TCP 套接字后立即发出。

所以我需要更改此代码:

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 回答