Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QT QTcpSocket在开始向服务器写入数据后丢失了一些数据_Qt_Sockets_Tcp_Qtcpsocket - Fatal编程技术网

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

QT QTcpSocket在开始向服务器写入数据后丢失了一些数据,qt,sockets,tcp,qtcpsocket,Qt,Sockets,Tcp,Qtcpsocket,我通过TCP从服务器获取正弦波并绘制它。一切似乎都很好,直到我开始在c>1000时发回一些东西。发送一个字节后,我仍然得到数据,但正弦波的波形发生了变化。我确信有一些丢失的数据,但我在代码中找不到bug。传输速率约为1Mbps 问题是 当我向服务器写入内容时,它对套接字有何影响 为什么套接字会丢失一些数据 我怎样才能修好它 ssTcpClient::ssTcpClient(QObject *parent) : QObject(parent) { socket = new QTcpSock

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

问题是

  • 当我向服务器写入内容时,它对套接字有何影响

  • 为什么套接字会丢失一些数据

  • 我怎样才能修好它

    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();
        }
    
    }
    
    ssTcpClient::ssTcpClient(QObject*parent):
    QObject(父对象)
    {
    插座=新QTC插座(本);
    连接(插座,信号(已连接()),
    此插槽(在_connected()上);
    连接(插座、信号(已断开)(),
    这个插槽(在_disconnected()上);
    }
    void ssTcpClient::on_connected()
    {
    qDebug()>buf;
    数据追加(buf);
    }
    //过程数据
    发射数据并读取(数据);
    //如果有超过1000个数据,那么发送一些回来
    如果(c>1000){
    char-msg[10];
    msg[0]=“c”;
    套接字->写入(消息,1);
    插座->冲洗();
    }
    }
    

  • 您不能依赖TCP通信来完成,数据以不确定的块到达

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


    我建议您修改您的数据源,使其要么发送字节计数作为第一件事,要么发送某种终止序列,您可以寻找它来告诉您已收到足够的数据进行处理。

    您不能依赖TCP通信来完成,数据以不确定的块到达

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


    我建议您修改您的数据源,使其要么发送字节计数作为第一件事,要么发送某种终止序列,您可以寻找它来告诉您已收到足够的数据进行处理。

    您不能依赖TCP通信来完成,数据以不确定的块到达

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


    我建议您修改您的数据源,使其要么发送字节计数作为第一件事,要么发送某种终止序列,您可以寻找它来告诉您已收到足够的数据进行处理。

    您不能依赖TCP通信来完成,数据以不确定的块到达

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

    我建议您修改您的数据源,以便它要么发送字节计数作为第一件事,要么发送某种终止序列,您可以寻找它来告诉您,您已经收到足够的数据进行处理