Qt:QSslSocket :: bytesWritten()信号太频繁发出

时间:2014-01-25 12:45:11

标签: c++ qt sockets qtcpsocket

我使用此代码通过套接字传输大文件而内存使用不会出现高峰

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

1 个答案:

答案 0 :(得分: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)));
}