我通过TCP从服务器获得正弦波并绘制它。一切似乎都很好,直到我开始在c> 1000时发回一些东西。发送一个字节后,我仍然得到数据,但正弦波的波形发生了变化。我确定有一些错过的数据,但我找不到代码中的错误。传输速率约为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();
}
}
答案 0 :(得分:2)
您无法依赖TCP流量完成,数据以不确定的块的形式到达。
您正在使用QDataStream
从套接字读取数据。这是一个非常糟糕的主意,因为QDataStream
假定您拥有完整的数据集。如果没有足够的数据,它将无声地失败。
我建议您修改数据源,以便它首先发送字节数,或者发送某种终止序列,您可以注意这些终止序列,告诉您已经收到足够的数据来处理。