簡體   English   中英

Qt:QSslSocket :: bytesWritten()信號過於頻繁地發出

[英]Qt: QSslSocket::bytesWritten() signal is emitted too often

我使用以下代碼通過套接字傳輸大文件, 而不會占​​用大量內存

    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,操作系統將其殺死。

經過更多的挖掘,我才找到答案,實際上是在文檔中。 看來我應該對SSL套接字使用encryptedBytesWritten()代替:

注意:請注意bytesWritten()信號和cryptobytesWritten()信號之間的區別。 對於QTcpSocket,一旦將數據寫入TCP套接字,就會發出bytesWritten()。 對於QSslSocket,在對數據進行加密時將發出bytesWritten(),而一旦將數據寫入TCP套接字,就將發出cryptobytesWritten()。

所以我需要更改此代碼:

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)));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM