2014-01-25 66 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 MB,並且操作系統會被殺死它。

回答

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