我有一个使用QTcp-Classes用c ++编写的TCP服务器和TCP客户端。现在我遇到的问题是,有时服务器会发出0
,但客户端会收到1
。一旦出现这个问题,我就必须重新启动所有内容以纠正这个问题
负责告诉我数据的最低级功能是:
客户端:
void Client::readData()
{
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_5_0);
if (blockSize == 0) {
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
return;
in >> blockSize;
}
if (tcpSocket->bytesAvailable() < blockSize)
{
qDebug() << tcpSocket->bytesAvailable() << ' ' << blockSize;
return;
}
in >> data;
blockSize = 0;
//qDebug() << "Client got new data!";
qDebug() << data.first << " " << data.second.toInt();
emit Client::gotData(data);
}
服务器:
void Server::sendData(QPair<QString, QVariant> data)
{
//! [5]
//QString data = "";
QPair<QString, QVariant> send_data = data;
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_0);
out << (quint16)0;
out << send_data;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
if(Server::clientConnection != NULL)
{
qDebug() << "New Connection: " << Server::clientConnection->peerAddress().toString() << " on Port: " << Server::clientConnection->peerPort();
QVariant ipAddr_QVar(Server::clientConnection->peerAddress().toString());
qDebug() << "New qvariant: " << ipAddr_QVar;
clientConnection->write(block);
}
else
qDebug() << "No connection!";
}
在上述函数中未定义的每个变量都在相应的类中定义
sendData()
- 函数通过(Signal-Slot-mechanism)调用:
void controller::positionChanged()
{
QVariant tmp(0);
qDebug() << "Position changed, stepper stopped " << tmp.toString() << "!";
emit sendDataMain(qMakePair(QString("STP"), tmp));
}
positionChanged() - qDebug() - 函数打印出0
,但有时readData函数会打印一个1
。
到目前为止我做了什么:
我试着用wireshark查看tcp-data,但是我无法读取QDataStreams ...
我尝试使用调试器,但随后出现相同的情况,调试器告诉我与qDebug()
相同的情况。所以,目前我不知道我做错了什么,也许这里有人可以帮助我?