c++ - Qt QTcpSocket 异步写入

标签 c++ qt sockets tcp qtcpsocket

我正在尝试将动态数据写入 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 是一个槽,每当有数据准备就绪时调用,strData 最多 8192 字节。

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

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

最佳答案

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

关于c++ - Qt QTcpSocket 异步写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17610839/

相关文章:

c++ - 将txt文件读入链表

QTextEdit 或 QTextBrowser 性能问题

c++ - QT Framework 从 4.7.2 更新到 5.2.1,QT 不想配置并给出 fatal error

javascript - (不正确的响应 NodeJS + Socket IO)NodeJS 在页面刷新时在套接字上多次写入数据

c++ - 堆栈内存/堆栈

c++ - 如何将 "struct first_name"重命名为 "struct second_name"

c++ - Qt 5.8(ubuntu 16.04)在Linux上的应用部署

c - 有没有办法减少套接字发送缓冲区大小的最小下限?

java.net.SocketException : Software caused connection abort: recv failed

c++ - 如何在 Eigen 中将稀疏矩阵转换为密集矩阵