Qt:QSslSocket::bytesWritten() 信号发出过于频繁

Posted

技术标签:

【中文标题】Qt:QSslSocket::bytesWritten() 信号发出过于频繁【英文标题】:Qt: QSslSocket::bytesWritten() signal is emitted too often 【发布时间】:2014-01-25 12:45:10 【问题描述】:

我使用此代码通过套接字传输一个大文件没有内存使用高峰

    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,操作系统将其杀死。

【问题讨论】:

【参考方案1】:

经过一番挖掘,我才找到了答案,实际上它在文档中。看来我应该将encryptedBytesWritten() 用于 SSL 套接字:

注意:注意 bytesWritten() 信号和 encryptedBytesWritten() 信号之间的区别。对于 QTcpSocket,一旦数据写入 TCP 套接字,就会发出 bytesWritten()。对于 QSslSocket,bytesWritten() 将在数据被加密时发出,而 encryptedBytesWritten() 将在数据写入 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)));

【讨论】:

以上是关于Qt:QSslSocket::bytesWritten() 信号发出过于频繁的主要内容,如果未能解决你的问题,请参考以下文章

Linux 打包 QT 程序

QT学习之QT 下载安装

Qt 找不到服务 - “org.qt-project.qt.mediaplayer”

[QT]加快qt编译:设置默认多核编译qt

qt + opengl 开发环境的搭建

qt creator和qt的区别