2014-01-25 2 views
2

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

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

ответ

3

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

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