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 ответ:
Я просто нашел ответ после еще нескольких раскопок, он был в документации на самом деле. Похоже, что я должен использовать
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))); }