QTcpSocket - 如何发送两个数字

Posted

技术标签:

【中文标题】QTcpSocket - 如何发送两个数字【英文标题】:QTcpSocket - How to send two numbers 【发布时间】:2017-12-18 08:09:38 【问题描述】:

客户端应用程序通过 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.. 有趣:如果我只写 一个 数字而不是两个数字,它确实有效!

知道我做错了什么吗?

【问题讨论】:

如果你在 'socket->read(bytes)' 之后 qDebug() &lt;&lt; buffer; 输出是什么?虽然我认为缺少 ; 不会导致编译错误;D. 【参考方案1】:

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

去同步 字节序 解析错误 ...

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 和阅读事务的更多信息

【讨论】:

【参考方案2】:

我认为你正在阅读垃圾数据,请查看中间声明

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

【讨论】:

感谢您的详细解释。我还有很多东西要学。 :D

以上是关于QTcpSocket - 如何发送两个数字的主要内容,如果未能解决你的问题,请参考以下文章

QTcp [服务器和套接字]:无法读取发送的文件

Qtcp在服务器和客户端之间以自定义速率发送数据

如何使用 QTcpSocket 获取 Protobuf 发送的数据 [重复]

如何使用 QTcpSocket 监听 qt 中的特定端口? [复制]

网络过载时 QTcpSocket 的行为是啥?

同一对象中的 QTcpSocket 到 QTcpSocket