【问题标题】:QT QTcpSocket miss some data after start write data to serverQT QTcpSocket 在开始向服务器写入数据后丢失了一些数据
【发布时间】:2024-01-17 18:42:01
【问题描述】:

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

问题是

  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();
        }
    
    }
    

【问题讨论】:

    标签: qt sockets tcp qtcpsocket


    【解决方案1】:

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

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

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

    【讨论】: