qtcpsocket-如何发送两个数字
QTcpSocket - How to send two numbers
客户端应用程序通过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 ,它使用方法
QByteArray::operator const char *() const
当删除临时对象时,您的指针就会悬挂。然后您正在阅读垃圾数据。
一件事,在这一行中
buffer.mid(2, 4); // should be 2 as second argument, this is not index but length
相关文章:
- C++通过数字比较两个数字
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 在 txt 文件中显示前两个数字的程序
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- 两个数字的对称配对功能
- 查找中间两个数字的正则表达式的匹配项
- 使用C++具有两个数字的最短路径算法.(C++)
- 将两个数字添加为链表
- C++ 分段错误:11 错误,同时编码将两个数字相加的链接列表
- 我应该如何使用remove_if删除两个数字范围内的元素
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 子数组中两个数字的相同出现(连续)
- 如何使用位操作在单个整数中编码和解码两个数字
- 在 c++ 程序中调试链表以添加两个数字: 有人可以解释为什么 l3=l3->next;导致错误?
- 钻头以两个数字替换位
- C 如何在小数系统中添加两个数字
- 为什么我的代码不给最后两个数字
- 如何在给出前两个数字的级数中找到大于 x 的第 n 个最小子数组总和?
- 输入两个数字后程序关闭
- 代码是否交换数组的两个数字