gpt4 book ai didi

c++ - QTcpSocket - 如何发送两个数字

转载 作者:行者123 更新时间:2023-11-28 04:52:24 25 4
gpt4 key购买 nike

客户端应用程序通过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 和 MessageSize 0。
  • 观察:从客户端发送不同的值甚至不会影响服务器输出。总是那个奇怪的数字 65501..
  • 有趣:如果我只写一个数字而不是两个,它确实有效!

知道我做错了什么吗?

最佳答案

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

  • 去同步化
  • 字节顺序
  • 解析错误
  • ...

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

您可以在 Documentation 阅读更多关于 QDataStream 和交易的信息。

关于c++ - QTcpSocket - 如何发送两个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47864320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com