Qt: QSslSocket:: byteswrited() сигнал испускается слишком часто


Я использую этот код для передачи большого файла через сокет без всплесков использования памяти :

    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 МБ, и ОС убивает его.

1 2

1 ответ:

Я просто нашел ответ после еще нескольких раскопок, он был в документации на самом деле. Похоже, что я должен использовать encryptedBytesWritten() для сокетов SSL вместо:

Примечание: будьте в курсе разницы между bytesWritten() сигнала и encryptedBytesWritten() сигнала. За помощью классов qtcpsocket, bytesWritten() вы излучаемый, как только данные были записаны в сокет TCP. Для QSslSocket, byteswrited() будет испускаться, когда данные шифруются и encryptedbyteswrited () будет получить излучение, как только данные были записаны в сокет 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)));
}