QT QTcpSocket在开始向服务器写入数据后错过了一些数据

时间:2014-03-04 12:43:13

标签: qt sockets tcp qtcpsocket

我通过TCP从服务器获得正弦波并绘制它。一切似乎都很好,直到我开始在c> 1000时发回一些东西。发送一个字节后,我仍然得到数据,但正弦波的波形发生了变化。我确定有一些错过的数据,但我找不到代码中的错误。传输速率约为1Mbps。

问题是

  1. 当我向服务器写东西时,它对套接字的影响如何?

  2. 为什么套接字错过了一些数据?

  3. 我该如何解决?

    ssTcpClient::ssTcpClient(QObject *parent) :
    QObject(parent)
    {
        socket = new QTcpSocket(this);
        connect(socket, SIGNAL(connected()),
                this, SLOT(on_connected()));
        connect(socket, SIGNAL(disconnected()),
                this, SLOT(on_disconnected()));
    }
    
    void ssTcpClient::on_connected()
    {
        qDebug() << "Client: Connection established.";
        connect(socket, SIGNAL(readyRead()),
                this, SLOT(on_readyRead()));
        in = new QDataStream(socket);
    }
    
    void ssTcpClient::on_readyRead(){
        static quint32 c = 0;
        qDebug() << "c" << c++;
    
        QVector<quint8> data;
        quint8 buf;
        while(socket->bytesAvailable()>0){
            //read data to buffer
            *in >> buf;
            data.append(buf);
        }
        //process data
        emit data_read(data);
    
        //if there are over 1000 data then send something back
        if(c>1000){
            char msg[10];
            msg[0] = 'c';
            socket->write(msg,1);
            socket->flush();
        }
    
    }
    

1 个答案:

答案 0 :(得分:2)

您无法依赖TCP流量完成,数据以不确定的块的形式到达。

您正在使用QDataStream从套接字读取数据。这是一个非常糟糕的主意,因为QDataStream假定您拥有完整的数据集。如果没有足够的数据,它将无声地失败。

我建议您修改数据源,以便它首先发送字节数,或者发送某种终止序列,您可以注意这些终止序列,告诉您已经收到足够的数据来处理。