1

我正在尝试将动态数据写入 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)时,会发生奇怪的事情,有时写入的数据比我预期的要多得多,有时会丢失一些数据,有时一段时间后什么也没有写入......

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

4

1 回答 1

3

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

于 2013-07-12T09:15:39.987 回答