Qt QTcpSocket 异步写入

Posted

技术标签:

【中文标题】Qt QTcpSocket 异步写入【英文标题】:Qt QTcpSocket async write 【发布时间】:2013-07-12 08:39:48 【问题描述】:

我正在尝试将动态数据写入 QTcpSocket,这就是我的实现方式:

    connect(&m_tcpSocket, SIGNAL(bytesWritten(qint64)), SLOT(written(qint64)));
//...
void MyClass::written(qint64 iBytes)

    if(iBytes>0)
        m_strWrite = m_strWrite.mid(iBytes);
    if(m_strWrite.length()<1)
    
        if(m_hHandle->isDone())
            m_tcpSocket.disconnectFromHost();
    else if(m_tcpSocket.isValid())
        m_tcpSocket.write(m_strWrite);
    

//...
void MyClass::dataReady(const QByteArray &strData)

    bool bWrite = m_strWrite.isEmpty();
    m_strWrite.append(strData);
    if(bWrite)
        written(0);

dataReady是一个slot,当有数据准备好时调用,strData最多8192字节。

这种方法效果很好,但是当数据很大(> 500 MB)时,会发生奇怪的事情,有时写入的数据比我预期的要多得多,有时会丢失一些数据,有时一段时间后什么都没有写入...... .

我只是想要动态缓冲区,写入套接字,还有其他方法吗?

【问题讨论】:

【参考方案1】:

QTcpSocket 有自己的写缓冲区。只需使用m_tcpSocket.write(strData)。 Qt 不限制写缓冲区大小。

【讨论】:

以上是关于Qt QTcpSocket 异步写入的主要内容,如果未能解决你的问题,请参考以下文章

无法写入 QRunnable 内的 QTcpSocket

我从 QThread 调用 QTcpSocket 类的写入函数时出现错误

QTcpSocket 在工作进程中连续写入。避免内存泄漏的最佳实践

C++ Qt - QTcpSocket - 找不到文件

Qt - 当一个类中有多个 QTcpSocket 时,我如何知道哪个 QTcpSocket 发出了 readyRead 信号?

如何安全地删除 QT::QTcpSocket?