簡體   English   中英

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和MessageSize 0。
  • 觀察:從客戶端發送不同的值甚至不會影響服務器的輸出。 總是怪異的號碼65501。
  • 有趣的是:如果我只寫一個數字而不是兩個,它確實可以工作!

知道我在做什么錯嗎?

發送原始數字絕不是一個好主意。 為什么會出錯的原因是:

  • Desychronisation
  • 字節序
  • 解析錯誤
  • ...

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的更多信息並閱讀事務。

我認為您正在讀取垃圾數據,請看中間聲明

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM