qtcpsocket-如何发送两个数字

QTcpSocket - How to send two numbers

本文关键字:两个 数字 何发送 qtcpsocket-      更新时间:2023-10-16

客户端应用程序通过qtcpsocket发送两个(ushort)号码:

ushort MessageId = 4;
ushort MessageSize = 0;
socket->write((const char*) &MessageId, sizeof(ushort));
socket->write((const char*) &MessageSize, sizeof(ushort));
socket->waitForBytesWritten();

服务器应用程序接收4个字节的长消息,并将其放入QByTearray缓冲区中,然后解码数字:

int bytes = socket->bytesAvailable();
QByteArray buffer = socket->read(bytes)
const char * messageIdBytes = buffer.mid(0, 2);
ushort messageId = (ushort)(*messageIdBytes);
const char * messageSizeBytes = buffer.mid(2, 4);
ushort messageSize = (ushort)(*messageSizeBytes );
qDebug() << QString("MessageId Bits: [%1], Value: [%2].").arg(QString::number(messageId, 2), QString::number(messageId));
qDebug() << QString("MessageSize Bits: [%1], Value: [%2].").arg(QString::number(messageSize, 2), QString::number(messageSize));

这给出以下服务器输出:(我添加了可读性的空间)

MessageId Bits: [1111 1111 1101 1101], Value: [65501].
MessageSize Bits: [1111 1111 1101 1101], Value: [65501].
  • 问题:服务器输出应接收messageID 4和Messageize 0。
  • 观察:从客户端发送不同的值甚至不会影响服务器输出。总是那个怪异的数字65501 ..
  • 有趣的是:如果我只写一个编号,而不是两个!
  • ,它确实有效。

知道我做错了什么?

发送原始数字从来都不是一个好主意。原因可能出错的原因是:

  • DeSychronisation
  • endianess
  • 解析错误
  • ...

QT中的最佳实践是使用QDataStream发送和接收数据:

客户端代码:

QDataStream stream(socket);
stream << MessageId << MessageSize;

服务器代码:

QDataStream stream(socket);
ushort MessageId, MessageSize;
stream.startTransaction();
stream >> MessageId >> MessageSize;
if(stream.commitTransaction())
    qDebug() << "Worked:" << MessageId << MessageSize;
else
    qDebug() << "Error:" << stream.status();

您可以阅读有关QDataStream的更多信息,并在文档中阅读交易

我认为您正在阅读垃圾数据,请查看Mid声明

QByteArray QByteArray::mid(int pos, int len = -1) const

它返回新对象,在此行中

const char * messageIdBytes = buffer.mid(0, 2);

mid函数返回临时对象 qbytearray ,它使用方法

将其转换为const char*
QByteArray::operator const char *() const

当删除临时对象时,您的指针就会悬挂。然后您正在阅读垃圾数据。

一件事,在这一行中

buffer.mid(2, 4); // should be 2 as second argument, this is not index but length